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