【进程】创建一个新的循环实例

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值