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

      

原文地址:https://www.cnblogs.com/venicid/p/7955127.html