• 解决multiprocessing.Process子进程中 input( ) 不干活的问题


    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()
  • 相关阅读:
    【皇甫】☀ 亮眼的颜色
    【皇甫】☀独一无二
    【皇甫】☀唯一
    【皇甫】☀一本好书 你值得浏览
    【皇甫】☀标题自己起 进来看像啥就是啥
    【皇甫】☀说说那些选择器
    【皇甫】☀标题被你吃了
    【皇甫】☀四套写入方案(仅供参考)
    【皇甫】☀内侧小解析---小行动(2)
    【皇甫】☀内侧小解析---小行动(1)
  • 原文地址:https://www.cnblogs.com/max404/p/11854414.html
Copyright © 2020-2023  润新知