13、多进程multiprocessing、进程池


内容相关:

multiprocessing:

  • 进程的创建与运行
  • 进程常用相关函数

进程池:

  • 为什么要有进程池
  • 进程池的创建与运行:串行、并行
  • 回调函数

多进程multiprocessing:

python中的多进程需要使用multiprocessing模块

  • 多进程的创建与运行:

1.进程的创建:进程对象=multiprocessing.Process(target=函数名,args=(参数,))【补充,由于args是一个元组,单个参数时要加“,”】

2.进程的运行:  进程对象.start()

进程的join跟线程的join一样,意义是 “阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程”

注:在windows中代码中必须使用这个,在Linux 中不需要加这个

import multiprocessing,time,os

def thread_run():
    print(threading.current_thread())

def run(name):
    time.sleep(1)
    print("hello",name,"run in ",os.getpid(),"ppid:",os.getppid())

if __name__==‘__main__‘:#必须加
    obj=[]
    for i in range(10):
        p=multiprocessing.Process(target=run,args=(‘bob‘,))
        obj.append(p)
        p.start()
    start_time=time.time()
    for i in obj:
        i.join()
    print("run in main")
    print("spend time :",time.time()-start_time)
  • 与多线程同样的:也可以通过继承multiprocessing的Process来创建进程

继承multiprocessing的Process类的类要主要做两件事:

1.如果初始化自己的变量,则先要调用父类的__init__()【如果不调用,则要自己填写相关的参数,麻烦!】然后做自己的初始化;如果不需要初始化自己的变量,那么不需要重写__init__,直接使用父类的__init__即可【已经继承了】

2.重写run函数

import multiprocessing

class myProcess(multiprocessing.Process):
    def run(self):
        print("run in myProcess")

if __name__=="__main__":
    p=myProcess()
    p.start()
    p.join()

进程常用相关函数:

  • os.getpid():获取当前进程号。
  • os.getppid():获取当前进程的父进程号。
  • 进程对象.is_alive():判断进程是否存活

  • 进程对象.terminate():结束进程【不建议的方法,现实少用】

进程池:

  • 为什么需要进程池
    • 如果要启动大量的子进程,可以用进程池的方式批量创建子进程,而进程池可以限制运行的进程的数量【有太多人想要游泳,而池子的容量决定了游泳的人的数量
    • Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果进程池满了,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求
  • 进程池的创建与使用:
    • 使用进程池需要导入:from multiprocessing import Pool
    • 创建进程池:进程池对象=Pool(容量)
    • 给进程池添加进程:
      • 串行:进程池对象.apply(func=函数名,args=(参数,))
from multiprocessing import Pool
import time,os

def func1(i):
    time.sleep(1)
    print("run in process:",os.getpid())

if __name__=="__main__":
    pool=Pool(5)

    start_time = time.time()
    for i in range(10):
        pool.apply(func=func1,args=(i,))#串行,这里是加一个运行完再加一个
     pool.close()#先close再等待
     pool.join()
    print("main run done,spend_time:",time.time()-start_time)
      • 并行:进程池对象.apply_async(func=函数名,args=(参数,),callback=回调函数)
from multiprocessing import Pool
import time,os

def func1(i):
    time.sleep(1)
    print("run in process:",os.getpid())

if __name__=="__main__":
    pool=Pool(5)

    start_time = time.time()
    for i in range(10):
        pool.apply_async(func=func1,args=(i,))#并行

    pool.close()#先close再等待
    pool.join()
    print("main run done,spend_time:",time.time()-start_time)#2.6,证明是并行
  • 回调函数的使用:在并行中,支持callback=回调函数,当一个进程执行完毕后会调用该回调函数,并且参数为func中的返回值
from multiprocessing import Pool
import time,os

def func1(i):
    time.sleep(1)
    print("run in process:",os.getpid())
    return "filename"

def log(arg):##参数为进程创建中func的函数的返回值
    print("log done :",arg)

if __name__=="__main__":
    pool=Pool(5)

    start_time = time.time()
    for i in range(10):
        pool.apply_async(func=func1,args=(i,),callback=log,)#log的参数是func1的返回值

    pool.close()#先close再等待
    pool.join()
    print("main run done,spend_time:",time.time()-start_time)

  • 注:对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。【意思就是比如游泳池只卖1个小时的票,约定5点关门,那么4点多之后就不能再卖票了,就一直等着游泳池里面的人出来再关门,进程池的close是一个关门的意思,并不是结束的意思,它只是关上了进来的门,而里面的进程还可以运行】【进程池的join是等池子里的所有进程执行完毕,如果后面再进来进程的话就没完没了了,所以需要先关闭进入,再等待进程结束】
      • 小测试:

原文地址:https://www.cnblogs.com/progor/p/8439000.html

时间: 2024-10-02 10:19:08

13、多进程multiprocessing、进程池的相关文章

38. Python 多进程Manager 进程池

强大的Manager模块 上一节实现的数据共享的方式只有两种结构Value和Array. Python中提供了强大的Manager模块,专门用来做数据共享. 他支持的类型非常多,包括:Value.Araay.list.dict.Queue.Lock等. 以下例子: import multiprocessing def worker(d,l):     l += range(11, 16)     for i in xrange(1, 6):         key = "key{0}"

multiprocessing模块的多进程与进程池

multiprocessing模块的Process方法 可以利用Proces方法在一个主进程中创建几个子进程 from multiprocessing import Process import time def f1(name): time.sleep(2) print('Hell %s' % name) def f2(age): time.sleep(2) print('Hell %s' % age) if __name__ == "__main__": p = Process(t

python3多进程和进程池

#一个程序运行起来之后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单位,不仅可以通过线程完成多任务,进程也是可以的#进程之间是相互独立的#cpu密集的时候适合用多进程 #多进程并发 import multiprocessing from multiprocessing import Pool import time def test1(): for i in range(10): time.sleep(1) print('test', i) def test2(): for i in

Python 多进程和进程池

一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是进程中最小的执行单位. 特点无法利用多核,无法实现真正意义上是并行效果. 优点:对于IO密集型的操作可以很好利用IO阻塞的时间 二,多进程 2.1 multiprocessing模块介绍 在上一节多线程中讲到,由于GIL的原因,多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在pytho

多进程和进程池

from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print 'Run child process %s (%s)...' % (name, os.getpid()) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Process(target=run_proc, args=('test',)) pr

python多进程操作-进程池

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,10几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,这时候进程池Pool发挥作用的时候就到了. Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求:但如果池中的进程数已经达到规定

多进程,进程池。

1.多进程的调用 1.1 multiprocessing调用 1 from multiprocessing import Process 2 import time 3 def f(name): 4 time.sleep(1) 5 print('hello', name,time.ctime()) 6 7 if __name__ == '__main__': 8 p_list=[] 9 for i in range(3): 10 p = Process(target=f, args=('alvi

第36篇 多进程的数据共享,进程池的回调函数,线程 什么是GIL锁,Threading模块记

内容概览: 进程 数据共享 进程池--回调函数 线程 线程的基础理论 什么是线程? 线程与进程的关系 GIL锁 线程的开启: Threading模块1,用多进程开启socket创建聊天 server端写了input函数会报错?因为服务器是高速运行的,自动化的为来访问的客户端提供服务, 不可能停下来等待管理员的输入,然后发送给客户.这就失去了自动化的意义. 2,进程池Pool()方法创建的进程,map()方法是否有返回值? p.map()得到的是迭代对象 import time from mult

第35篇 进程之间的通信 Queue Pipe 进程池Pool,p.apply()方法,p.apply_async()方法

内容大纲: 进程之间的通讯 进程队列 管道 进程之间的数据共享 进程池 使用进程池 开启进程 提交任务 获得返回值 回调函数1.进程队列 先进先出 from multiprocessing import Queue import queue q = Queue() q.put(1) q.put(2) q.put(3) print(q.get()) print(q.get()) print(q.get()) 1 2 3 from multiprocessing import Queue impor

python并发编程(管道,事件,信号量,进程池)

管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pipe def f1(conn): from_zhujincheng = conn.recv() print('子进程') print('来自主进程的消息:',from_zhujincheng) if __name__ == '__main__': conn1,conn2 = Pipe() #创建一个管