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("\r%.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=

      

最新文章

  1. 【开源项目SugarSite】ASP.NET MVC+ Layui+ SqlSugar+RestSharp项目讲解
  2. Java面向对象的继承
  3. poj 2976 Dropping tests 0/1分数规划
  4. insert时出现主键冲突的处理方法【转载】
  5. windows理论基础(一)
  6. 查看一个int数组里边的每个数字出现过几次
  7. POJ 2251 三维BFS(基础题)
  8. JFreeChart与AJAX+JSON+ECharts两种处理方式生成热词统计可视化图表
  9. 激活IDEA
  10. java中的并发工具类
  11. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
  12. request.getParameterValues 出现 [Ljava.lang.String;@ 错误
  13. css 实用代码汇总
  14. scrapy 去重 dont_filter=False
  15. [转]Handsontable对单元格的操作
  16. 安装xadmin后台管理插件
  17. Intel万兆网卡背靠背连接ping不通那点事儿
  18. vue2.0读书笔记2-进阶
  19. MongoHelper.cs
  20. iOS中数组遍历的方法及比较

热门文章

  1. 虚拟机装ubuntu (kylin) 时常遇问题
  2. web API之post参数传递
  3. ezmorph-1.0.6.jar的作用
  4. SOJ 1002/1003/1004 大整数相加/相乘/相除
  5. 显卡 GPU 关系
  6. JAVA JAVA面试题和项目面试核心要点精华总结(想进大公司必看)
  7. 文件上传之FileItem使用
  8. redis安装和简介(1)
  9. jQuery序列化Ajax提交表单
  10. 产线事故:删除创建mysql索引