线程的代替方案
- subprocess
-完全跳过线程,使用进程
-是派生进程的主要替代方案
- python2.4后引入 - mulitiprocessiong
-使用threading的派生,使用子进程.
- 允许为多核或者多CPU派生进程,接口跟threading非常相似
- python2.6 - concurrent.futures
- 新的异步执行模块
- 任务级别的操作
- Python3.2后引入
多进程
- 进程间通讯(InterprocessCommunication,IPC)
- 进程之间无任何共享状态
案例19
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import multiprocessing
from time import sleep,ctime
def clock(interval):
while True:
print("我是分隔符~~~~~The time is %s"%ctime())
sleep(interval)
if __name__== "__main__":
p = multiprocessing.Process(target = clock,args = (6,))
p.start()
while True:
sleep(1)
print("sleep~~~~~~~~~~~~~~")
案例20
-派生子类
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import multiprocessing
from time import sleep,ctime
class ClockProcess(multiprocessing.Process):
def __init__(self,interval):
super().__init__()
self.interval=interval
def run(self):
while True:
print("The time is %s"%ctime())
sleep(self.interval)
if __name__== "__main__":
p= ClockProcess(3)
p.start()
案例21
- 在OS中查看PID,PPID以及他们的关系
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
from multiprocessing import Process
from time import sleep,ctime
import os
def info(tittle):
print(tittle)
print("moudle name:",__name__)
print("parent process",os.getppid())
print("process id :",os.getpid())
def f(name):
info("function f")
print("hello",name)
if __name__ == "__main__":
info("main line")
p = Process(target=f, args= ("bob",))
p.start()
p.join()
生产者消费者模型
joinableQueue
案例22
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import multiprocessing
from time import ctime
def consumer(input_q):
print("Into consumer:",ctime())
while True:
item = input_q.get()
if item is None:
break
print("pull",item,"out of q")
input_q.task_done()
print("Out of consumer:",ctime())
def producer(sequence,output_q):
print("Into producer:", ctime())
for item in sequence:
output_q.put(item)
print("put",item,"into q")
print("out of procuder:",ctime())
if __name__=="__main__":
q = multiprocessing.JoinableQueue()
cons_p1 = multiprocessing.Process(target= consumer,args=(q,))
cons_p1.start()
cons_p2 = multiprocessing.Process(target= consumer,args=(q,))
cons_p2.start()
#生产多个项目,sequence代表要发送给消费者的项序列
#在实践中,这可能是生成器的输出或通过一些其他方式生产出来
sequence = [1,2,3,4]
print(sequence,q)
q.put(None)
q.put(None)
cons_p1.join()
cons_p2.join()