2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块
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=
2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块的更多相关文章
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()
GetCurrentDirectory 获得的是当前进程的活动目录(资源管理器决定的),可以用SetCurrentDirectory 修改的. 转自 http://m.blog.csdn.net/bl ...
- python 进程 multiprocessing模块
一.multiprocess.process模块 1.process类 Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得 ...
- 进程 multiprocessing Process join Lock Queue
多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 cpu 切换程序+保存程序状态 1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率,并且不 ...
- Python: 多进程的分布式进程multiprocessing.managers
multiprocessing.managers 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分 ...
- 进程 multiprocessing详解
一 ,核心 就是像线程一样管理进程 ,类似于threading ,cup利用率较好,该模块用来跨平台的多进程模块,含有一个Process 类代表进程对象,start() 启动进程 Process语法结 ...
- 创建进程池与线程池concurrent.futures模块的使用
一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- 进程管理02 通过PEB枚举进程所有模块
0x01 结构探究 先在win7 x86下通过windbg来探究通过peb来得到进程模块的步骤: 命令!process 0 0 exeplorer.exe 先获取到explorer.exe的EPRO ...
随机推荐
- Vue-Resource请求PHP数据失败的原因
在写一个Vue项目的时候发现在使用Vue-Resource的post方法请求PHP数据时,完全没有反应,查阅资料才知道没有加配置参数: { emulateJSON:true } 这个配置参数的意思是: ...
- 使用commons-fileupload-1.2.1.jar等组件实现文件上传
使用的主要jar包:commons-io-1.3.2.jar包;commons-fileupload-1.2.1.jar包:commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前 ...
- hibernate 映射 数据库number 映射为 double 为空 报错问题
将 数据库表 映射成hibernate 实体类时 将number --- double 如果数据库中number 为空,查找数据时将报错 Can not set double field ***** ...
- 解决hash冲突方法
转自:https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公 ...
- 关于mysql 出现 1264 Out of range value for column 错误的解决办法
今天给客服恢复mysql数据的时候.本来测试好的数据.但是到了客户那里却死活不干活了.老报错! INSERT INTO ka_tan4 set num='716641385999', username ...
- [19/04/04-星期四] IO技术_CommonsIO(通用IO,别人造的轮子,FileUtils类 操作文件 & IOUtilsl类 操作里边的内容 )
一.概念 JDK中提供的文件操作相关的类,但是功能都非常基础,进行复杂操作时需要做大量编程工作.实际开发中,往往需要 你自己动手编写相关的代码,尤其在遍历目录文件时,经常用到递归,非常繁琐. Apac ...
- Java: System.exit() 与安全策略
说明 System.exit() 的本质是通知 JVM 关闭. 一般来说,有两种禁用 System.exit() 的办法: 安全管理器 安全策略 本质都是JRE 提供的本地实现,在执行之前进行权限判断 ...
- iOS开发中方法延迟执行的几种方式
概述 项目开发中经常会用到方法的延时调用,下面列举常用的几种实现方式: 1.performSelector 2.NSTimer 3.NSThread线程的sleep 4.GCD 1.performSe ...
- idea教程视频以及常用插件整理
最近在同事的强烈安利下把eclipse换成idea了,本以为需要经历一个艰难的过渡期,谁知道不到3天就深感回不去了. 哎,只能说有时候人的惰性是多么可怕! idea实在是太太太强大了. 不要再问原因. ...
- stack的三个意思
(转自阮一峰的网络日志,原网址http://www.ruanyifeng.com/blog/2013/11/stack.html) 阮一峰老师终于又更新博客了,个人认为这篇文章有一定科普意义,有一定解 ...