join用法(等待子进程运行完)
from multiprocessing import Process
import time,os
def task(s):
time.sleep(s)
if __name__ == '__main__':
p1 = Process(target=task,args=(100,))
p2 = Process(target=task,args=(2,))
p3 = Process(target=task,args=(3,))
p1.start()
p2.start()
p3.start()
p1.join() # 等1s,
p2.join() # 等1s,
p3.join() # 等1s,内部会调用wait()
print(p1.pid)
print('子',p1.pid)
print('主',os.getpid()) # 主进程要等待所有的子进程结束才会结束.因为主进程要在结束前回收僵尸进程.(*****)
terminate的用法(杀死进程)
p = Process(target=foo)
p.start()
p.terminate() # 给操作系统发了一个请求 强行终止进程p 可能需要一点时间
print(p.is_alive()) # True is_alive() 判断子进程是否活着
p.join()
print(p.is_alive()) # False
daemon(守护进程)
if __name__ == '__main__':
p = Process(target=task)
p.daemon = True ## 主进程结束,子进程也会结束
p.start()
time.sleep(2)
print('主')
进程锁 : 是把锁住的代码变成了串行
join 是把所有的子进程变成了串行
lock = Lock() # 写在主进程是为了让子进程拿到同一把锁.
Queue(队列)
q = Queue(n) ##n是队列的容量
q.put('xxx') ##放数据
q.get() ##拿数据
拿或者取的时候没有值时会卡住
q = Queue()
q.put_nowait('666') # block = False
print(q.get_nowait()) #666
JoinableQueue模块用法
from multiprocessing import Process,Queue,JoinableQueue
q = JoinableQueue()
q.put('zhao') # 放队列里一个元素 +1
q.put('qian') +1
print(q.get())
q.task_done() # 完成了一次任务 -1
print(q.get())
q.task_done() # 完成了一次任务 -1
q.join() #计数器不为0的时候 阻塞等待计数器为0后通过
# 想象成一个计数器 :put +1 task_done -1