pyinvoke / invoke

Pythonic task management & command execution.
http://pyinvoke.org
BSD 2-Clause "Simplified" License
4.32k stars 365 forks source link

How to use context.run(asynchronous=True) for many tasks #892

Open adamcunnington-mlg opened 1 year ago

adamcunnington-mlg commented 1 year ago

Hi, a usage question as the docs are quite lite on this topic.

If I want to make 5 context.run() calls concurrently but I don't want to complete execution of my function until they have all finished, is there something more elegant than this:

class AggregateError(Exception): 
    pass

running = [context.run(foo, async=True), context.run(bar, async=True), context.run(baz, async=True)]

while running:
    for promise, index in enumerate(running[:]):
        ....
adamcunnington commented 1 year ago

Is this project dead?

kuwv commented 1 year ago

@adamcunnington no the project is still maintained. The BDFL unfortunately is stretched thin.

Sorry, I don't have the answer you need at the moment though.

paw-lu commented 1 year ago

@adamcunnington

I think you might be able to use .join here?

Example

running = [  # Launch jobs
    context.run(foo, async=True),
    context.run(bar, async=True),
    context.run(baz, async=True),
]

for promise in running:  # This block won't complete until all jobs finish
    running.join()
paw-lu commented 1 year ago

Here's the docs on it for further reading.

adamcunnington commented 1 year ago

Thanks for this! I had seen the API docs for that method but hadn't quite understood how to use it in the case of multiple jobs - but now see from your code snippet that it's embarrassingly simple! Thanks!