Spec out the async-ipc protocol #36
Labels
enhancement
New feature or request
help wanted
Extra attention is needed
IPC and transport
messaging
messaging patterns and protocols
question
Further information is requested
Milestone
tractor
utilizes a simple multiplexed protocol for conducting inter-process-task-communication (IPTC)?Each per-process
trio
task can invoke tasks in other processes and received responses depending on the type of the remote callable. All packets are encoded asmsgpack
serialized dictionaries which I'll refer to as messages.How it works
When an actor wants to invoke a remote routine it sends a
cmd
packet:{'cmd': (ns, func, kwargs, uid, cid)}
of typeDict[str, Tuple[str, str, Dict[str, Any], Tuple[str, str], str]]
Where:
ns
is the remote module namefunc
is the remote function namekwargs
is adict
of keyword arguments to call the function withuid
is the unique id of the calling actorcid
is the unique id of the call by a specific taskThe first response is a function type notifier msg:
{'functype': functype, 'cid': cid}
of typeDict[str, str]
.Where
functype
can take one of:'asyncfunc'
for an asynchronous function'asyncgen
for a single direction stream either implemented using an asyn generator function or a@stream
decorated async func'context'
for a inter actor, task linked, context. For now see Bidir streaming #209.Depending on the value of
functype
then the following message(s) are sent back to the caller:'asyncfunc'
:{'return', result, 'cid', cid}
of typeDict[str, Any]
'asyncgen'
:{'yield', value, 'cid', cid}
of typeDict[str, Any]
.'context'
:'started'
message containing a first value returned from theContext.started()
call in the remote task followed by a possible stream of{'yield', value, 'cid', cid}
messages if a bidir stream is opened on each side. Again see Bidir streaming #209.A remote task which is streaming over a channel can indicate completion using a ''stop'` message:
{'stop': True}
If a remote task errors it should capture it's error output (still working on what output) and send it in a message back to its caller:
{'error': {tb_str': traceback.format_exc(), 'type_str': type(exc).__name__,}}
tractor
this is done by thepack_error()
funcA remote actor must have a system in place to cancel tasks spawned from the caller. The system to do this should be invoke-able using the existing protocol defined above and thus no extra "cancel" message should be required (I think).
Actor._cancel_task()
routine in the remote actor. This routine should have knowledge of the rpc system and be capable of looking up the caller's task-id to conduct cancellation.tractor.CancelScope
around calls toPortal.run()
see Cross-actor cancel scopes? #122What should be done
.asend()
also mentioned in an internal todo.async_generator.aclosing()
- maybe an alternative reactive programming approach may end up being better?The text was updated successfully, but these errors were encountered: