#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
05-07 15:19
查看更多