关于python中协程asynico 与进程池pool冲突的问题
使用Pool进程池并发,然后让将每个进程的任务注册在一个在事件循环中,但Pool没有生效,是哪里出现了问题?
from multiprocessing import Pool
import asyncio
import time
async def fristwork():
await asyncio.sleep(1)
print("fristwork take" ,str(time.time()))
return "Done"
async def secondwork():
a = await fristwork()
print (a)
def task(num):
coroutine = secondwork()
loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine)
print("task {}".format(num))
async def run_more(num):
print("start run_more")
pool = Pool(processes = 2)
for i in range(num):
pool.apply_async(task,args=(i,))
print(i)
pool.close()
pool.join()
def main(num):
coroutine = run_more(num)
tasks = [
asyncio.ensure_future(coroutine),
]
loop2 = asyncio.get_event_loop()
loop2.run_until_complete(asyncio.wait(tasks))
if __name__ == '__main__':
main(4)
以下为输出:
start run_more
0
1
2
3
fristwork take 1509178144.5045896
Done
task 0
fristwork take 1509178144.5145957
Done
task 1
fristwork take 1509178145.506057
Done
task 2
fristwork take 1509178145.517011
Done
task 3
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
asyncio多进程情况下最好不要使用同一个loop,用
new_event_loop
为每个子进程分配一个loop,因为asyncio在不同进程之间轮训时,没有进程安全限制,也没有根据进程id区分不同进程的工作任务,asyncio最新的开发计划中将增加这部分处理,可以等等看