考题说明
用比较简洁的代码,实现以下一个父子进程配合工作的功能。
传给程序四个数字参数,分别是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.
【22528】 a + b = 3 in subprocess.
【22528】 subprocess end.
【22527】 c + d = 7 in main process
【22527】 main compute end.
【22527】 3 * 7 = 21 in main process
知识点总结
1, 了解父子进程的创建过程
2, 了解父子进程的执行规律
3, 了解父子进程的通讯方式
4, 了解异步IO库的使用以及执行规律
5, 就题目本身,是可以不使用sockerpair的。请思考其他进程间通讯的方法。
6, 就题目本身,是可以不使用asyncio的。思考如果不使用asyncio的优缺点。