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模块的更多相关文章

  1. Python 线程(threading) 进程(multiprocessing)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. 获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()

    GetCurrentDirectory 获得的是当前进程的活动目录(资源管理器决定的),可以用SetCurrentDirectory 修改的. 转自 http://m.blog.csdn.net/bl ...

  3. python 进程 multiprocessing模块

    一.multiprocess.process模块 1.process类 Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得 ...

  4. 进程 multiprocessing Process join Lock Queue

    多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 cpu 切换程序+保存程序状态 1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率,并且不 ...

  5. Python: 多进程的分布式进程multiprocessing.managers

    multiprocessing.managers 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分 ...

  6. 进程 multiprocessing详解

    一 ,核心 就是像线程一样管理进程 ,类似于threading ,cup利用率较好,该模块用来跨平台的多进程模块,含有一个Process 类代表进程对象,start() 启动进程 Process语法结 ...

  7. 创建进程池与线程池concurrent.futures模块的使用

    一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...

  8. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  9. 进程管理02 通过PEB枚举进程所有模块

    0x01  结构探究 先在win7 x86下通过windbg来探究通过peb来得到进程模块的步骤: 命令!process 0 0 exeplorer.exe 先获取到explorer.exe的EPRO ...

随机推荐

  1. IntelliJ IDEA 2017 完美注册方法及破解方法

    本文使用破解方式注册. 下载破解文件JetbrainsCrack-2.6.2.jar 下载地址: http://idea.lanyus.com/ 开始破解 一.将下载的 JetbrainsCrack- ...

  2. BZOJ1996:[HNOI2010]CHORUS 合唱队(区间DP)

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用 ...

  3. Vue通过input筛选数据

    <div id="app"> <input v-model='search' /> <ul> <li v-for="item i ...

  4. List环形双向链表

    实现一个环形的双向链表,链表的每个节点都保存三个信息,当前节点的值value,前一个节点的指针prev,后一个节点的指针next.因为是环形的,所以最后一个节点的next指向第一个节点,而第一个节点的 ...

  5. 课时56.marquee标签(理解)

    这个标签是比较特殊的,不是html5中的新增标签 在W3C官方文档中找不到这个标签,也就是说不是官方推荐的标签 但是各大浏览器对这个标签的支持也非常不错,而且效果也非常不错 1.什么是marquee标 ...

  6. unittest单元测试框架之测试套件(三)

    1.测试套件(注意:测试用例先添加先执行,后添加后执行,由此组织与设定测试用例的执行顺序) addTests:添加多个测试用例 addTest:添加单个测试用例 import unittest fro ...

  7. Python 学习笔记(十)Python集合(二)

    集合常用的方法 add()       向集合中增加一个元素,如果集合中已经有了这个元素,那个这个方法就会失效 >>> help(set.add) Help on method_de ...

  8. MyBatis之Mapper XML 文件详解(二)-sql和入参

    sql 这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中.它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化. 比如: <sql id="use ...

  9. 【最新】LuaJIT 32/64 位字节码,从编译到使用全纪录

    网上关于 LuaJIT 的讨论,已经显得有些陈旧.如果你对 LuaJIT 编译 Lua 源文件为具体的 32位或64位字节码,极其具体使用感兴趣的话,不妨快速读一下这篇文章.此文章针对尝试在 iOS ...

  10. 『ACM C++』 PTA 天梯赛练习集L1 | 046-47

    今日刷题 ------------------------------------------------L1-046----------------------------------------- ...