import asyncio
import os
import random
import typing
from multiprocessing import Process
processes = []
# 停止进程
def cleanup():
global processes
while processes:
proc = processes.pop()
try:
proc.join()
except KeyboardInterrupt:
# Ctrl+C终止进程
proc.terminate()
# 一个协程
async def worker():
random_delay = random.randint(0, 3)
result = await asyncio.sleep(random_delay, result=f"正在运行的进程id: {os.getpid()}")
print(result)
def process_main(coro_worker: typing.Callable, num_of_coroutines: int, ):
"""
在单独的进程中运行多个协程的进程类。将在每个进程中运行的函数
建议使用asyncio.run而不是实例化自己的事件循环。
此示例仅用于说明如何在不同进程中实例化事件循环!
:param coro_worker:
:param num_of_coroutines:
:return:
"""
loop = asyncio.new_event_loop()
try:
workers = [coro_worker() for _ in range(num_of_coroutines)]
loop.run_until_complete(asyncio.gather(*workers, loop=loop))
except KeyboardInterrupt:
print(f"Stoping {os.getpid()}")
loop.stop()
finally:
loop.close()
# 进程启动process_main函数:一个进程运行两个事件循环
def main(processes, num_procs, num_coros, process_main):
for _ in range(num_procs):
proc = Process(target=process_main, args=(worker, num_coros))
processes.append(proc)
proc.start()
if __name__ == '__main__':
try:
main(processes, 10, 2, process_main, )
except KeyboardInterrupt:
print("Ctrl+C 停止运行")
finally:
cleanup()
print("CleanUp finished")
输出:
正在运行的进程id: 14624
正在运行的进程id: 14624
正在运行的进程id: 14612
正在运行的进程id: 14612
正在运行的进程id: 14652
正在运行的进程id: 14652
正在运行的进程id: 15068
正在运行的进程id: 15068
正在运行的进程id: 14672
正在运行的进程id: 14672
正在运行的进程id: 14280
正在运行的进程id: 14280
正在运行的进程id: 8196
正在运行的进程id: 8196
正在运行的进程id: 14096
正在运行的进程id: 14096
正在运行的进程id: 14076
正在运行的进程id: 14076
正在运行的进程id: 12632
正在运行的进程id: 12632
CleanUp finished