关于python中协程asynico 与进程池pool冲突的问题

发布于 2022-09-06 02:34:08 字数 1185 浏览 21 评论 0

使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

涙—继续流 2022-09-13 02:34:08

asyncio多进程情况下最好不要使用同一个loop,用new_event_loop为每个子进程分配一个loop,因为asyncio在不同进程之间轮训时,没有进程安全限制,也没有根据进程id区分不同进程的工作任务,asyncio最新的开发计划中将增加这部分处理,可以等等看

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文