zoukankan      html  css  js  c++  java
  • day36-进程操作实例,守护进程,方法,属性

    #1、server端跟多个client端聊天:
    #异步操作,主进程负责接收client的连接,子进程负责跟client聊天。
    #每接收一个连接,就创建一个子进程,子进程之间的数据是隔离的,互不影响,所以server端可以跟多个client端聊天。
    #server:
    import socket
    from multiprocessing import Process
    
    def talk(conn):       #子进程
        conn.send(b'hello client')
        ret = conn.recv(1024).decode('utf-8')
        print(ret)
        conn.close()  # conn.close()放在这里是为了让每一个连接都关闭,如果放在外面就只能关闭最后一个连接。
    
    if __name__ == '__main__':
        sk = socket.socket()
        sk.bind(('127.0.0.1',8080))
        sk.listen()
        while True:                    #如果没有循环,下面的代码只运行一次,只能跟一个client连接。
            conn,addr = sk.accept()    #client一运行就连接上server,server接收连接。
            p = Process(target=talk,args=(conn,))
            p.start()               #开启子进程
    
        sk.close() #如果sk.close()放在talk的里面,第一个连接聊完天之后就关闭了整个通信,后面的连接都无法通信,所以必须放在外面。
    
    #client:
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
    ret = sk.recv(1024).decode('utf-8')
    print(ret)
    msg = input('client:')
    sk.send(msg.encode('utf-8'))
    sk.close()
    
    #2、守护进程daemon:随着主进程的结束而结束。如果不设置守护进程,当主进程执行完之后,子进程会一直不停止地打印&&&。
    from multiprocessing import Process
    import time
    def func():
        while True:
            time.sleep(1)   #设置睡眠1秒是为了看效果。
            print('&&&')
    
    if __name__ == '__main__':
        p = Process(target=func)
        p.daemon = True         #把子进程设置为守护进程,守护进程要在start之前设置。
        p.start()
        for i in range(100):
            time.sleep(0.1)  #设置睡眠0.1秒是为了看效果。
            print('*'*i)
    
    #3、进程的其他方法:is_alive、terminate
    #p.is_alive() 是否活着,结果是布尔类型,True表示进程还在,False表示进程不在。
    #p.terminate() 结束进程。
    from multiprocessing import Process
    import time
    def func():
        print('qqqqq')
    
    if __name__ == '__main__':
        p = Process(target=func)
        p.start()
        print(p.is_alive()) #True
        p.terminate()             #结束子进程
        time.sleep(1)           #主进程阻塞,系统调度子进程执行。否则下面代码的结果还是True,因为子进程还没被调度。
        print(p.is_alive()) #False,当子进程执行之后,因为上面代码结束子进程,所以结果是False。
    # True
    # False
    
    #4、属性:进程名:name,进程id:pid,Process类里面有self.name和self.pid属性:
    from multiprocessing import Process
    def func():
        print('qqq')
    
    if __name__ == '__main__':
        p = Process(target=func)
        p.start()
        print(p.name,p.pid)
    # Process-1 18696
    # qqq
    
    from multiprocessing import Process
    class MyProcess(Process):
        def run(self):
            print('子进程',self.name,self.pid)
    
    if __name__ == '__main__':
        p = MyProcess()
        p.start()
    # 子进程 MyProcess-1 12488
  • 相关阅读:
    threading库知识点补充
    数字中 数组排序
    python 多线程 thread (控制主线程跑完,子线程也关闭) 和 (等待子线程跑完,主线程才关闭)
    进程和线程理解
    上下文与 with语句 (如打开文件open的巧妙写法)
    Python中字符串String去除出换行符和空格的问题( , )
    去掉字符空格的方法
    postman 参数化(含文本)
    python之数组元素去重
    sql中limit使用方法
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12142703.html
Copyright © 2011-2022 走看看