GIL(全局解释器锁)-同一时刻只能有一个线程运行,解决多线程资源竞争的问题,无法利用cpu多核优势
多进程可以绕过GIL,利用cpu多核资源
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'anne',) 4 kwargs表示调用对象的字典,kwargs={'name':'anne','age':18} 5 name为子进程的名称
#方法一 直接调用 import time import random from multiprocessing import Process def run(name): print('%s runing' %name) time.sleep(random.randrange(1,5)) print('%s running end' %name) p1=Process(target=run,args=('anne',)) #必须加,号 p2=Process(target=run,args=('alice',)) p3=Process(target=run,args=('biantai',)) p4=Process(target=run,args=('haha',)) p1.start() p2.start() p3.start() p4.start() print('主线程')
#方法二 继承式调用 import time import random from multiprocessing import Process class Run(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s runing' %self.name) time.sleep(random.randrange(1,5)) print('%s runing end' %self.name) p1=Run('anne') p2=Run('alex') p3=Run('ab') p4=Run('hey') p1.start() #start会自动调用run p2.start() p3.start() p4.start() print('主线程')
守护进程:守护进程会在主进程代码执行结束后就终止,守护进程内无法再开启子进程
进程锁:
#由并发变成了串行,牺牲了运行效率,但避免了竞争 from multiprocessing import Process,Lock import os,time def work(lock): lock.acquire() print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) lock.release() if __name__ == '__main__': lock=Lock() for i in range(3): p=Process(target=work,args=(lock,)) p.start()