zoukankan      html  css  js  c++  java
  • Process类的应用

    注意:在windows中Process()必须放到# if __name__ == '__main__':下

    Since Windows has no fork, the multiprocessing module starts a new Python process and imports the calling module. 
    If Process() gets called upon import, then this sets off an infinite succession of new processes (or until your machine runs out of resources). 
    This is the reason for hiding calls to Process() inside
    
    if __name__ == "__main__"
    since statements inside this if-statement will not get called upon import.
    由于Windows没有fork,多处理模块启动一个新的Python进程并导入调用模块。 
    如果在导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资源)。 
    这是隐藏对Process()内部调用的原,使用if __name__ == “__main __”,这个if语句中的语句将不会在导入时被调用。
    
    详细解释

    创建并开启子进程的两种方式

    #开进程的方法一:
    import time
    import random
    from multiprocessing import Process
    def piao(name):
        print('%s piaoing' %name)
        time.sleep(random.randrange(1,5))
        print('%s piao end' %name)
    
    
    
    p1=Process(target=piao,args=('egon',)) #必须加,号
    p2=Process(target=piao,args=('alex',))
    p3=Process(target=piao,args=('wupeqi',))
    p4=Process(target=piao,args=('yuanhao',))
    
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    print('主线程')
    
    方法一
    #开进程的方法二:
    import time
    import random
    from multiprocessing import Process
    
    
    class Piao(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
        def run(self):
            print('%s piaoing' %self.name)
    
            time.sleep(random.randrange(1,5))
            print('%s piao end' %self.name)
    
    p1=Piao('egon')
    p2=Piao('alex')
    p3=Piao('wupeiqi')
    p4=Piao('yuanhao')
    
    p1.start() #start会自动调用run
    p2.start()
    p3.start()
    p4.start()
    print('主线程')
    
    方法二

    练习1:把上周所学的socket通信变成并发的形式

    from socket import *
    from multiprocessing import Process
    
    server=socket(AF_INET,SOCK_STREAM)
    server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    
    def talk(conn,client_addr):
        while True:
            try:
                msg=conn.recv(1024)
                if not msg:break
                conn.send(msg.upper())
            except Exception:
                break
    
    if __name__ == '__main__': #windows下start进程一定要写到这下面
        while True:
            conn,client_addr=server.accept()
            p=Process(target=talk,args=(conn,client_addr))
            p.start()
    
    server端
    from socket import *
    
    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('127.0.0.1',8080))
    
    
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
    
        client.send(msg.encode('utf-8'))
        msg=client.recv(1024)
        print(msg.decode('utf-8'))
    
    多个client端
    每来一个客户端,都在服务端开启一个进程,如果并发来一个万个客户端,要开启一万个进程吗,你自己尝试着在你自己的机器上开启一万个,10万个进程试一试。
    解决方法:进程池
  • 相关阅读:
    自身哲学
    horovod
    nvidia-smi 关键知识
    7.22实习培训日志-JSP Servlet
    7.20实习培训日志-Java基础程序设计结构
    7.19实习培训日志- java进阶
    7.18实习培训日志-环境配置与设计模式
    7.17实习培训日志-java基础
    7.10实习培训日志-Maven 敏捷编程
    7.15实习培训日志 java题解
  • 原文地址:https://www.cnblogs.com/wangmengzhu/p/7443958.html
Copyright © 2011-2022 走看看