python父子进程通过sockerpair通讯的实例

考题说明

用比较简洁的代码,实现以下一个父子进程配合工作的功能。
传给程序四个数字参数,分别是a,b,c, d。

主进程创建子进程。
子进程负责计算a+b。
主进程负责计算c+d。
主进程计算完a+b后,获得子进程的计算结果后,再计算两者乘机并print出来。

笔者给出的一个参考答案

import asyncio, os

global main_value # 用来保存主进程的计算结果

# 创建sockerpair对象
def create_socket_pair():
    try:
        from socket import socketpair
    except ImportError:
        from asyncio.windows_utils import socketpair
    rsock, wsock = socketpair()
    return (rsock, wsock)

# 子进程的主逻辑
def main_for_subprocess(wsock, a, b):
    print("【%s】- subprocess began." % os.getpid())
    x = int(a) + int(b)
    print("【%s】- a + b = %s in subprocess." % (os.getpid(), x))
    wsock.send(str(x).encode())
    print("【%s】- subprocess end." % os.getpid())

# 创建并启动子进程
def create_and_start_subprocess(wsock, a, b):
    from multiprocessing import Process
    p = Process(target=main_for_subprocess, args=(wsock, a, b))
    p.start()

# sockerpair读端的回调函数
def reader_callback(loop, rsock):
    data = rsock.recv(100)
    data = data.decode()
    global main_value
    print("【%s】- %s * %s = %s in main process" % (os.getpid(), data, main_value, int(data) * main_value))
    loop.remove_reader(rsock)
    loop.stop()

# 主进程的计算逻辑
def compute_main(loop, c, d):
    print("【%s】- main compute began." % os.getpid())
    import time
    time.sleep(2) # 假设主进程计算需要花费2秒
    global main_value
    main_value = int(c) + int(d)
    print("【%s】- c + d = %s" % (os.getpid(), main_value))
    print("【%s】- main compute end." % os.getpid())

# 主函数入口
def main_for_father_process(a, b, c, d):
    #使用event_loop来注册和监听事件
    loop = asyncio.get_event_loop()
    rsock, wsock = create_socket_pair()
    loop.add_reader(rsock, reader_callback, loop, rsock)
    loop.call_soon(create_and_start_subprocess, wsock, a, b)
    loop.call_soon(compute_main, loop, c, d)
    loop.run_forever()
    rsock.close()
    wsock.close()
    loop.close()


if __name__ == '__main__':
    main_for_father_process(1, 2, 3, 4)

打印结果

22527】 main compute began.
【22528】 subprocess began.
【22528a + b = 3 in subprocess.
【22528】 subprocess end.22527】 c + d = 7 in main process22527】 main compute end.225273 * 7 = 21 in main process

知识点总结

1, 了解父子进程的创建过程
2, 了解父子进程的执行规律
3, 了解父子进程的通讯方式
4, 了解异步IO库的使用以及执行规律
5, 就题目本身,是可以不使用sockerpair的。请思考其他进程间通讯的方法。
6, 就题目本身,是可以不使用asyncio的。思考如果不使用asyncio的优缺点。

猜你喜欢

转载自blog.csdn.net/leon_wzm/article/details/79083915