多进程启动方式一
from mutiprocessing import Process
import os
def func(args):
print(args)
print('子进程的进程号:',os.getpid())
print(12345)
if __name__=='__main__':
#p = Process(target=func)#注册,无参数
#p = Process(target=func,args=(54321,))#注册带一个参数,加逗号
p = Process(target=func,args=('参数','参数'))#注册带参数,加逗号
#p是一个进程对象,还没有启动
p.start()
print('*'*10)#和上一句同时运行,是异步的
print('父进程的进程号:',os.getpid())
print('父进程的父进程:',os.getppid())
join() 用法 可以起多个进程异步执行,然后规定在某一个节点之前 完成时,使用join()
感知子进程结束,将异步程序改为同步
from mutiprocessing import Process
import os
def func(args1,args2):
print(args1)
time.sleep(5)
print(args2)
if __name__=='__main__':
p_lst=[]
for i in range(10):
p = Process(target=func,args=(10*i,20*i))
p_lst.append(p)
p.start()
[p.join() for p in p_lst]#所有进程运行完之后执行下面的语句
print("运行完了")#在该节点之前所有进程运行结束
多任务启动方式二
import os
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,args1,arg2):
super().__init__()
self.arg1 = args1
self.arg2 = args2
def run(self):
print(self.pid)
print(self.name)
print(os.getpid())
if __name__ == '__main__':
print('主:',os.getpid())
p1 = MyProcess()
p1.start()
p2 = MyProcess()
p2.start()
#自定义类 继承Process类
#必须实现一个run方法,run方法是在子进程中执行的代码
进程与进程之间的数据是隔离的
使用多进程实现socket服务器并发效果
#server.py
import socket
from multiprocessing import Process
def server(con):
con.send('你好'.encode('utf-8'))
msg = con.recv(1024).decode('utf-8')
print(msg)
con.close()
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:
con ,addr = sk.accept()
p = Process(target=server,args=(con,))
p.start()
sk.close()
#client.py
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
msg = sk.recv(1024).decode('utf-8')
print(msg)
msg = input('>>>').encode('utf-8')
sk.send(msg)
sk.close()
以上虽然实现了多进程并发但还没有调优
子进程随着主进程的代码执行完毕(而不是随着主进程的结束而结束)而结束就叫守护进程
from multiprocessing import Process
import time
def func():
while True:
time.sleep(0.2)
print('我还活着')
if __name__ == '__main__':
p = Process(target=func)
p.daemon = True #设置子进程为守护进程
p.start()
i=0
while i<10:
print("我是socket server")
time.sleep(1)
i+=1
#主进程结束而子进程并没有结束,设置p.daemon = True,将子进程设置为守护进程
#子进程随着主进程的代码执行完毕而结束就叫守护进程
from multiprocessing import Process
import time
def func():
while True:
time.sleep(0.2)
print('我还活着')
def func2():
print('func2 start')
time.sleep(8)
print('fun2 finished')
if __name__ == '__main__':
p = Process(target=func)
p.daemon = True #设置子进程为守护进程
p.start()
Process(target=func2).start()
i=0
while i<5:
print("我是socket server")
time.sleep(1)
i+=1