Python——多进程
进程的实例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding:UTF-8 -*- import os import time from multiprocessing import Process #进程 def func(args,args2): #对应下面的参数1,参数2 print(args,args2) print(54321) time.sleep(1) print('子进程:',os.getpid()) print('子进程的父进程:',os.getpid()) print(12345) if __name__ == '__main__': p = Process(target = func,args=('参数1','参数2') # 进程注册,p是一个进程对象、 p.start() #启动一个子进程,操作系统创建进程 print('*'*10) print('父进程:',os.getpid()) print('父进程的父进程:',os.getpid())
多进程的方法
1、join() #是感知一个子进程的结束
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding:UTF-8 -*- import time from multiprocessing import Process #进程 def func(arg1,arg2): print('*'*arg1) time.sleep(1) print('*'*arg2) if __name__ = '__main__': p = Process(target=func,args(10,20)) p.start() p.join() #是感知一个子进程的结束 print('===========:运行完了
2、开启多个子进程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*- coding:UTF-8 -*- 2 import time 3 from multiprocessing import Process #进程 4 def func(arg1,arg2): 5 print('*'*arg1) 6 time.sleep(1) 7 print('*'*arg2) 8 9 if __name__ = '__main__': 10 p_lst = [] 11 for i in rang(10): #同时启用10个进程 12 p = Process(target=func,args(10*i,20*i)) 13 p_lst.append(p) #将所有进程加入进程列表 14 p.start() 15 [p.join() for p in p_lst] #结束每一个子进程 16 print('===========:运行完了
方法2:面向对象的方法
(1)自定义类,继承Process类
(2)必须实现一个run的方法,run方法是在子进程中执行的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from multiprocessing import Process #进程 2 class MyProcess(Porcess): 3 def run(self): 4 print(self.pid) 5 print(self.name) 6 print(os.getpid()) 7 8 9 if __name__ = '__main__': 10 print('主进程的id:',os.getpid()) 11 p1 = MyProcess() 12 p1.start() 13 p2 = MyProcess() 14 p2.start()
传参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import os 2 from multiprocessing import Process #进程 3 class MyProcess(Porcess): 4 def __init__(self,arg1,arg2): 5 super().__init__() 6 self.arg1 = arg1 7 self.arg2 = arg2 8 9 def run(self): 10 print(self.pid) 11 print(self.name) 12 print(os.getpid()) 13 print(self.arg1) 14 print(self.arg2) 15 16 17 if __name__ = '__main__': 18 print('主进程的id:',os.getpid()) 19 p1 = MyProcess(1,2) 20 p1.start() 21 p2 = MyProcess(3,4) 22 p2.start()
3、使用多进程实现socket服务(tcp协议)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import socket 2 3 sk = socket.socket() 4 sk.connect(('127.0.0.1',8080)) 5 msg = sk.recv(1024).decode('utf-8') 6 print(msg) 7 msg2 = input('>>>').encode('utf-8') 8 sk.send(msg2) 9 sk.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import socket 2 from multiprocessing import Process 3 def serve(conn): 4 ret = '你好'.encode('utf-8') 5 conn.send(ret) 6 msg = conn.recv(1024).decode('utf-8') 7 print(msg) 8 conn.close() 9 10 if __name__ == '__main__' : 11 sk = socket.socket() 12 sk.bind(('127.0.0.1',8080)) 13 sk.listen() 14 try: 15 while True: 16 conn,addr = sk.accept() 17 p = Process(target=serve,args=(conn,)) 18 p.start() 19 finally: 20 sk.close()
4、守护进程
子进程——转换——守护进程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 子进程 -- > 守护进程 2 import time 3 from multiprocessing import Process 4 5 def func(): 6 while True: 7 time.sleep(0.2) 8 print('我还活着') 9 10 def func2(): 11 print('in func2 start') 12 time.sleep(8) 13 print('in func2 finished') 14 15 if __name__ == '__main__': 16 p = Process(target=func) 17 p.daemon = True # 设置子进程为守护进程 18 p.start() 19 p2 = Process(target=func2) 20 p2.start() 21 p2.terminate() # 结束一个子进程 22 time.sleep(1) 23 print(p2.is_alive()) # 检验一个进程是否还活着 24 print(p2.name) 25 # i = 0 26 # while i<5: 27 # print('我是socket server') 28 # time.sleep(1) 29 # i+=1 30 31 # 守护进程 会 随着 主进程的代码执行完毕 而 结束 32 # 在主进程内结束一个子进程 p.terminate() 33 # 结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程 34 # 检验一个进程是否活着的状态 p.is_alive() 35 # p.name p.pid 这个进程的名字和进程号
5、进程锁
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 锁 2 3 # 火车票 4 import json 5 import time 6 from multiprocessing import Process 7 from multiprocessing import Lock 8 9 # def show(i): 10 # with open('ticket') as f: 11 # dic = json.load(f) 12 # print('余票: %s'%dic['ticket']) 13 14 def buy_ticket(i,lock): 15 lock.acquire() #拿钥匙进门 16 with open('ticket') as f: 17 dic = json.load(f) 18 time.sleep(0.1) 19 if dic['ticket'] > 0 : 20 dic['ticket'] -= 1 21 print('\033[32m%s买到票了\033[0m'%i) 22 else: 23 print('\033[31m%s没买到票\033[0m'%i) 24 time.sleep(0.1) 25 with open('ticket','w') as f: 26 json.dump(dic,f) 27 lock.release() # 还钥匙 28 29 if __name__ == '__main__': 30 # for i in range(10): 31 # p = Process(target=show,args=(i,)) 32 # p.start() 33 lock = Lock() 34 for i in range(10): 35 p = Process(target=buy_ticket, args=(i,lock)) 36 p.start()