解决multiprocessing.Process子进程中 input( ) 不干活的问题
Posted on 2019-11-14 00:28 Max404 阅读(532) 评论(0) 编辑 收藏 举报server
from multiprocessing import Process import socket,sys,os class MyProcess(Process): def __init__(self,args): super().__init__() self.args = args[0:2] self.fn = args[2] def run(self): sys.stdin = os.fdopen(self.fn) print("子进程开始.") while 1: try: client_from_msg = self.args[0].recv(1024).decode() print(client_from_msg) if not client_from_msg: break server_input = input(" >>:").strip() se = server_input.encode() self.args[0].send(se) except Exception: break if __name__ == '__main__': print("主进程开始.") server = socket.socket() ip_port = ("127.0.0.1", 8020) server.bind(ip_port) server.listen(2) fn = sys.stdin.fileno() while 1: conn, client_addr = server.accept() p = MyProcess(args=(conn, client_addr,fn)) p.start()
client
import socket client = socket.socket() ip_port = ("127.0.0.1", 8020) client.connect(ip_port) while 1: inp = input(">>>:") if not inp: continue client.send(inp.encode("utf-8")) from_server_msg = client.recv(1024).decode() print("来自服务端的消息:", from_server_msg) client.close()
multiprocessing.Process 该类原型如下: class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}) group参数通常为None,仅仅是为兼容threading.Thread。 target为可调用对象,被run()函数调用,一般用法就是将函数传给该参数,交给子进程运行。 name为进程名,如不指定,默认为Process-1,Process-2....这样的名字,数字随自己查数量依次递增。 args为target调用的参数元祖。 kwargs为target调用的关键字参数字典。 Process类生成一个process对象,并运行在一个新的单独的进程内。 如果在子进程里面要接受标准输入(如调用raw_input函数),这时候会有问题。因为标准输入是被父进程占用,因此这里子进程无法从标准输入读取数据。 一个解决办法是将标准输入描述符,传入子进程函数: 1 from multiprocessing import Process 2 import sys, os 3 import time 4 5 def intask(x, fileno): 6 sys.stdin = os.fdopen(fileno) 7 while True: 8 in_char = raw_input("Enter to continue, Q to quit: ") 9 if in_char.upper() == 'Q': 10 break 11 print x * x 12 13 if __name__ == '__main__': 14 fn = sys.stdin.fileno() 15 arg = 5 16 p = Process(target = intask, args = (arg, fn)) 17 p.start() 18 p.join()