学习日记0905 进程与进程相关知识点
1 开启进程的两种方式
方式一:
from multiprocessing import Process import time def task(name): print('%s is running' %name) time.sleep(3) print('%s is done' %name) # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中 if __name__ == '__main__': p=Process(target=task,args=('egon',)) #Process(target=task,kwargs={'name':'egon'}) p.start() # 只是向操作系统发送了一个开启子进程的信号 print('主')
方式二:
补充:开启进程实际就是在调用Process下面的run方法
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 done' %self.name) # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中 if __name__ == '__main__': p=Myprocess('egon') p.start() # 只是向操作系统发送了一个开启子进程的信号 print('主')
join方法的使用与介绍:
等待含有join方法(与time.sleep()相似 相当于wait)的子进程结束才会运行其他进程
from multiprocessing import Process import time def task(name,n): print('子进程开启', name) time.sleep(n) print('子进程结束!',name) if __name__ == '__main__': p = Process(target=task,kwargs={'name':'egon','n':3}) p.start() p.join() p2 = Process(target=task, kwargs={'name': 'beard', 'n': 1}) p2.start() print('这是主进程!')
运行结果:
3 知识点补充:
每个进程之间是在内存中是相互隔离的
4 查看进程的pid
每个进程在内中都有一个id,这个id叫pid
获取pid有两种方式:
方式一:
current_process().pid
from multiprocessing import Process,current_process import time def task(): print('%s is running' %current_process().pid) time.sleep(30) print('%s is done' %current_process().pid) if __name__ == '__main__': p=Process(target=task) p.start() print('主',current_process().pid)
os.getpid()
from multiprocessing import Process import os def task(): print('%s is running' %os.getpid()) time.sleep(30) print('%s is done' %os.getpid()) if __name__ == '__main__': p=Process(target=task) p.start() print('主',os.getpid())
5 僵尸进程与孤儿进程
僵尸进程:没有被系统回收的进程,该进程会一直的占用内存空间
孤儿进程:(在linux系统中)父进程是init的进程
6 守护进程
本质就是一个子进程,该进程的生命周期<=被守护的进程
在子进程中加入p.daemon = True 注意 此代码要加在p.start()前面
from multiprocessing import Process import time def task(name): print('老太监%s活着....' %name) time.sleep(3) print('老太监%s正常死亡....' %name) if __name__ == '__main__': p=Process(target=task,args=('刘清政',)) p.daemon=True p.start() time.sleep(1) print('皇上:EGON正在死...')
7 互斥锁
互斥锁的作用是将本来并发的进程编程串行
例如:
import json import time,random from multiprocessing import Process,Lock def search(name): with open('db.json','rt',encoding='utf-8') as f: dic=json.load(f) time.sleep(1) print('%s 查看到余票为 %s' %(name,dic['count'])) def get(name): with open('db.json','rt',encoding='utf-8') as f: dic=json.load(f) if dic['count'] > 0: dic['count'] -= 1 time.sleep(random.randint(1,3)) with open('db.json','wt',encoding='utf-8') as f: json.dump(dic,f) print('%s 购票成功' %name) else: print('%s 查看到没有票了' %name) def task(name,mutex): search(name) #并发 mutex.acquire() get(name) #串行 mutex.release() # with mutex: # get(name) if __name__ == '__main__': mutex = Lock() for i in range(10): p=Process(target=task,args=('路人%s' %i,mutex)) p.start()