创建进程的两种方式 进程对象及其他方法 守护进程 进程间数据是隔离的 join方法
创建进程的两种方式
# 创建进程的第一种方法 from multiprocessing import Process import time def test(name): print('%s is running'% name) time.sleep(3) print('%s is over' %name) # window创建进程会将代码以模块的方式 从上往下执行一遍 # linux会直接将代码完完整整的拷贝一份 # windows创建进程一定要在if __name__ == '__main__': 代码块内创建 否则报错 if __name__ == '__main__': p = Process(target=test,args=('james',)) p.start() print('主程序') ''' 创建进程就是在内从中重新开辟一块内存空间 将允许产生的代码块丢进去 一个进程对应在内存就是一块独立的空间 进程与进程之间的数据是隔离的 无法直接交互 但是可以通过某些技术实现间接交互 ''' # 创建进程的第二种方式 from multiprocessing import Process import time class MyProcess(Process): def __init__(self,name): super().__init__() self.name = name def run(self): print('%s is running' %self.name) time.sleep(3) print('%s is over' %self.name) if __name__ == '__main__': p = MyProcess('james') p.start() print('主程序')
进程对象及其他方法
from multiprocessing import Process import os import time def test(name): print('%s is running'% name ,'子进程%s'%os.getpid(),'父进程%s'%os.getppid()) time.sleep(3) print('%s is over'%name) if __name__ == '__main__': p = Process(target=test,args=('james',)) p.start() p.terminate() time.sleep(0.1) print(p.is_alive()) print('主程序',os.getpid(),'主主进程%s'%os.getppid())
守护进程
from multiprocessing import Process import time def test(name): print('%s还正常活着'%name) time.sleep(3) print('%s 这个人没了,说没就没了'%name) if __name__ == '__main__': p = Process(target=test,args=('james',)) p.daemon = True p.start() time.sleep(0.1) print('这小子终于死了')
join方法
from multiprocessing import Process import time def test(name,i): print('%s is running'%name) time.sleep(i) print('%s is over'%name) if __name__ == '__main__': p_list = [] p = Process(target=test,args=('james,1')) p1 = Process(target=test,args=('koby,1')) p2 = Process(target=test,args=('love,1')) start_time = time.time() p.start() p1.start() p2.start() p.join() p1.join() p2.join() # 主程代码等待子进程运行结束 才继续进行 # p.join() # 主进程代码等待子进程运行结束 print('主程序') print(time.time()-start_time)
进程间数据是隔离的
from multiprocessing import Process import time money = 100 def test(): global money money = 99999999 if __name__ == '__main__': p = Process(target=test) p.start() p.join() print(money)
互斥锁
传建一个文件 data
文件内容
{"ticket": 5}
from multiprocessing import Process,Lock import time import json #查票 def search(i): with open('data','r',encoding='utf-8') as f: data = f.read() t_d = json.loads(data) print('用户%s查询余票为%s'%(i,t_d.get('ticket'))) # 买票 def buy(i): with open('data','r',encoding='utf-8') as f: data = f.read() t_d = json.loads(data) time.sleep(1) if t_d.get('ticket') > 0: # 票数减一 t_d['ticket'] -= 1 # 更新票数 with open('data','w',encoding='utf-8') as f: json.dump(t_d,f) print('用户%s抢票成功'%i) else: print('没票了') def run(i,mutex): search(i) mutex.acquire() # 抢锁 buy(i) mutex.release() # 释放锁 if __name__ == '__main__': mutex = Lock() for i in range(10): p = Process(target=run,args=(i,mutex)) p.start()