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

猜你喜欢

转载自www.cnblogs.com/python-daxiong/p/12114107.html