Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对并行任务使用异步IO_Python_Python 3.x_Python Asyncio - Fatal编程技术网

Python 对并行任务使用异步IO

Python 对并行任务使用异步IO,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我想知道如何使用asyncio来处理与nodeJS类似的任务。我希望在不打开线程的情况下同时运行任务。 例如: 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(se

我想知道如何使用asyncio来处理与nodeJS类似的任务。我希望在不打开线程的情况下同时运行任务。 例如:

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不会并行运行。它运行一个任务直到等待,然后继续执行下一个任务。第一个示例中的
sleep
s是使任务相互产生控制的原因。第二个示例并不等待任何操作,因此每个任务都会运行到完成,然后事件循环才能控制另一个任务

如果您在协同程序中添加了一些可等待的内容(例如,
asyncio.sleep
),那么每一个都将产生控制权,并给其他人一个运行的机会

@asyncio.coroutine
def my_coroutine(task_name):
    print('order placed for ' + task_name)
    yield from asyncio.sleep(0)  # Another coroutine will resume here.
    print(timeit.timeit('1 + 3 ', number=50000000))
    yield from asyncio.sleep(0)  # Another coroutine will resume here.
    print(task_name + ' done')

asyncio不会并行运行。它运行一个任务直到等待,然后继续执行下一个任务。第一个示例中的睡眠是使任务相互产生控制的原因。您的第二个示例并不等待任何操作,因此每个任务都会一直运行到完成,然后事件循环才能控制另一个任务。我明白了。那么,如何将第二个代码转换为异步任务呢?我尝试添加来自的收益率,但仍然无法像第一个示例那样工作。您是如何添加来自的
收益率的?您是添加了asyncio.sleep(n)
的收益还是做了其他事情?我做了其他事情。我不确定应该怎么做,但基本上,我想做第二个例子中的事情。你能给我看看吗?看看这个相关的问题: