#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