zoukankan      html  css  js  c++  java
  • 解决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()
  • 相关阅读:
    AcWing 1027. 方格取数 dp
    AcWing 1014. 登山 dp
    acwing 482. 合唱队形 dp
    LeetCode 1463. 摘樱桃II dp
    LeetCode 100. 相同的树 树的遍历
    LeetCode 336. 回文对 哈希
    LeetCode 815. 公交路线 最短路 哈希
    算法问题实战策略 DARPA大挑战 二分
    算法问题实战策略 LUNCHBOX 贪心
    AcWing 1100. 抓住那头牛 BFS
  • 原文地址:https://www.cnblogs.com/max404/p/11854414.html
Copyright © 2011-2022 走看看