1
我想知道如何使用asyncio来处理类似nodeJS的任务。我想在不打开线程的情况下同时运行任务。 例子:为并行任务使用asyncio
import asyncio
@asyncio.coroutine
def my_coroutine(task_name, seconds_to_sleep=3):
print('{0} sleeping for: {1} seconds'.format(task_name, seconds_to_sleep))
yield from asyncio.sleep(seconds_to_sleep)
print('{0} is finished'.format(task_name))
loop = asyncio.get_event_loop()
tasks = [
my_coroutine('task1', 4),
my_coroutine('task2', 3),
my_coroutine('task3', 2)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
将输出:
task1 sleeping for: 4 seconds
task2 sleeping for: 3 seconds
task3 sleeping for: 2 seconds
task3 is finished
task2 is finished
task1 is finished
但是当我尝试用不同的任务来完成它,它不喜欢你的工作。
import asyncio
import timeit
@asyncio.coroutine
def my_coroutine(task_name):
print('order placed for ' + task_name)
print(timeit.timeit('1 + 3 ', number=50000000))
print(task_name + ' done')
loop = asyncio.get_event_loop()
tasks = [
my_coroutine('task1'),
my_coroutine('task2'),
my_coroutine('task3')]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
输出
order placed for task2
0.6677237730912453
task2 done
order placed for task1
0.6627442526498016
task1 done
order placed for task3
0.665618849882418
task3 done
asyncio不会并行运行。它运行一个任务直到它等待,然后转到下一个任务。你的第一个例子中的睡眠是什么使任务相互控制。你的第二个例子没有等待任何事情,所以每个任务都会一直运行直到事件循环可以控制另一个任务。 – dirn
我明白了。那么如何让我的第二个代码进入一个异步任务?我尝试添加产量,但它仍然不像第一个例子那样工作。 – Zepol
你是如何添加'yield from'的?你是从asyncio.sleep(n)增加'yield还是你做了别的? – dirn