1.multiprocessing模块
- multiprocessing模块就是跨平台版本的多进程模块。
- multiprocessing模块提供了一个Process类来代表一个进程对象,
2.Process语法结构:
Process([group [, target [, name [, args [, kwargs]]]]])
-
target:表示这个进程实例所调用对象;
-
args:表示调用对象的位置参数元组;
-
kwargs:表示调用对象的关键字参数字典;
-
name:为当前进程实例的别名;
-
group:大多数情况下用不到;
Process类常用方法:
-
is_alive():判断进程实例是否还在执行;
-
join([timeout]):是否等待进程实例执行结束,或等待多少秒;
-
start():启动进程实例(创建子进程);
-
run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;
-
terminate():不管任务是否完成,立即终止;
Process类常用属性:
-
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;
-
pid:当前进程实例的PID值;
1) Process(target=test)
from multiprocessing import Process import time def test(): while True: print("----test1---") time.sleep(1) #Process() #实例化一个进程 p = Process(target=test) p.start() #让这个进程开始执行test函数的代码 while True: print("----main---") time.sleep(1)
----main--- ----test1--- ----main--- ----test1--- ----main--- ----test1---
- 该程序等待子进程执行完成才关闭
- fork创建的子进程,和程序没有关系,随便关闭
from multiprocessing import Process import time def test(): for i in range(5): print("----test1---") time.sleep(1) p = Process(target=test) p.start() #让这个进程开始执行test函数的代码
python@ubuntu:~/python06/03-多任务$ python3 13-Process创建的子进程和父进程的关系.py ----test1--- ----test1--- ----test1--- ----test1--- ----test1--- python@ubuntu:~/python06/03-多任务$
2)给target函数传递参数
from multiprocessing import Process import os def test(num): print("---pid=%d,ppid=%d,,num=%d"%(os.getpid(),os.getppid(),num)) p = Process(target=test,args=(100,)) p.start() print("---main-- pid=%d--"%os.getpid())
---main-- pid=2789-- ---pid=2790,ppid=2789,,num=100
3) join 堵塞
from multiprocessing import Process import os import random import time def test(): for i in range(random.randint(1,5)): print("---test--%d"%i) time.sleep(1) p = Process(target=test) p.start() p.join() #堵塞 #等待子进程结束,再往下走 #p.join(1) #超时时间1s #关门狗 p.terminate() #不管任务是否完成,就终止 print("---main-- pid=%d--"%os.getpid())
2.进程的创建-Process子类
- 简单工厂模式:父类提供接口,子类自己实现方法
from multiprocessing import Process import time class MyNewProcess(Process): def run(self): #父类的start()方法调用run方法 while True: print("----1--") time.sleep(1) p = MyNewProcess() p.start() #父类方法有start() while True: print("----main---") time.sleep(1)
----main--- ----1-- ----main--- ----1-- ----main--- ----1--
- time模块
In [1]: import time In [2]: time.ctime() #格式化时间 Out[2]: 'Sat Dec 2 17:28:18 2017' In [3]: time.sleep(1) #休眠1s In [4]: time.time() #linux 1970年到现在多少秒 Out[4]: 1512206917.624274 ##计算一个程序花费的时间time.time() In [5]: start_time = time.time() In [6]: start_time Out[6]: 1512206924.3197203 In [7]: end_time = time.time() In [8]: end_time Out[8]: 1512206933.599762 In [9]: run_time = end_time - start_time In [10]: run_time Out[10]: 9.280041694641113
打印进度条
import time for i in range(1,101): print(" %.2f%%"%i, end='') time.sleep(0.01) print("")
3.进程池
- 上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
from multiprocessing import Pool import os import random import time def worker(num): for i in range(5): print("===pid=%d==num=%d="%(os.getpid(), num)) time.sleep(1) #3表示 进程池中对多有3个进程一起执行 pool = Pool(3) for i in range(10): print("---%d---"%i) #向进程池中添加任务 #注意:如果添加的任务数量超过了 进程池中进程的个数的话,那么不会导致添加不进入 # 添加到进程中的任务 如果还没有被执行的话,那么此时 他们会等待进程池中的 # 进程完成一个任务之后,会自动的去用刚刚的那个进程 完成当前的新任务 pool.apply_async(worker, (i,)) pool.close()#关闭进程池,相当于 不能够再次添加新任务了 pool.join()#主进程 创建/添加 任务后,主进程 默认不会等待进程池中的任务执行完后才结束 #而是 当主进程的任务做完之后 立马结束,,,如果这个地方没join,会导致 #进程池中的任务不会执行
--0--- ---1--- ---2--- ---3--- ---4--- ---5--- ---6--- ---7--- ---8--- ---9--- ===pid=3036==num=0= ===pid=3035==num=1= ===pid=3037==num=2= ===pid=3037==num=2= ===pid=3036==num=0= ===pid=3035==num=1= ===pid=3036==num=0= ===pid=3037==num=2= ===pid=3035==num=1= ===pid=3037==num=2= ===pid=3036==num=0= ===pid=3035==num=1= ===pid=3036==num=0= ===pid=3037==num=2= ===pid=3035==num=1= ===pid=3035==num=3= ===pid=3037==num=4= ===pid=3036==num=5= ===pid=3035==num=3= ===pid=3036==num=5= ===pid=3037==num=4=