[saga-rg] Asynchronous calls
Tom Goodale
goodale at cct.lsu.edu
Fri Jan 7 16:02:32 CST 2005
Hi,
we'll shortly be circulating some strawman APIs from December's design
team meeting. One issue which we would like some good feedback on is the
subject of asynchronous calls. Currently we have an API with no
callbacks, but even so we came up with six possible ways to make the API
asynchronous, which are annotated below. The first five involve the
generation of a task object, which would have as a minumum API
task.run
task.wait(timeout)
task.cancel
and the last one (model F) is a straight async model where each call has
an asynchronous version. The advantage of a task model over that is that
it allows more than one asynchronous operation on an object at one time.
The general feeling of the design team was that model B was the one to go
for, and that is the one currently being written up, however we would like
to get some more feedback on whether there are strong objections or if we
have missed anything crucial which would make this model unviable in
practice.
Cheers,
Tom
Note that the calls below are schematic, e.g. copy, move, signal, ... will
take more arguments.
-----------------------------
SAGA_Directory dir = new SAGA_Directory ("foo://bar/baz")
SAGA_Job job = ...
-----------------------------
Model A)
SAGA_DirTask dt1 = dir.createTask ();
SAGA_DirTask dt2 = dir.createTask ();
SAGA_DirTask dt3 = dir.createTask ();
SAGA_JobTask jt1 = job.createTask ();
SAGA_JobTask jt2 = job.createTask ();
dt1.ls ();
dt2.copy ();
dt3.move ();
jt1.checkpoint ();
jt2.signal ();
dt1.run ();
dt2.run ();
dt3.run ();
jt1.run ();
jt2.run ();
-----------------------------
Model B)
dtf = dir.createTaskFactory ();
jtf = job.createTaskFactory ();
SAGA_Task t1 = dtf.ls ();
SAGA_Task t2 = dtf.copy ();
SAGA_Task t3 = dtf.move ();
SAGA_Task t4 = jtf.checkpoint ();
SAGA_Task t5 = jtf.signal ();
t1.run ();
t2.run ();
t3.run ();
t4.run ();
t5.run ();
-----------------------------
Model C)
SAGA_Task t1 = dir.task.ls ();
SAGA_Task t2 = dir.task.copy ();
SAGA_Task t3 = dir.task.move ();
SAGA_Task t4 = job.task.checkpoint ();
SAGA_Task t5 = job.task.signal ();
t1.run ();
t2.run ();
t3.run ();
t4.run ();
t5.run ();
-----------------------------
Model D)
SAGA_Task t1 = dir.task_ls ();
SAGA_Task t2 = dir.task_copy ();
SAGA_Task t3 = dir.task_move ();
SAGA_Task t4 = job.task_checkpoint ();
SAGA_Task t5 = job.task_signal ();
t1.run ();
t2.run ();
t3.run ();
t4.run ();
t5.run ();
-----------------------------
Model E)
SAGA_Task t1 = dir.getTask ("ls");
SAGA_Task t2 = dir.getTask ("copy");
SAGA_Task t3 = dir.getTask ("move");
SAGA_Task t4 = job.getTask ("checkpoint");
SAGA_Task t5 = job.getTask ("signal");
t1.run ();
t2.run ();
t3.run ();
t4.run ();
t5.run ();
-----------------------------
Model F)
(Not a "task" model)
dir.async_ls ();
job.async_checkpoint ();
job.wait ();
dir.wait ();
dir.async_copy ();
dir.wait ();
dir.async_move ();
job.async_signal (URS);
job.wait ();
dir.wait ();
More information about the saga-rg
mailing list