python_多进程_Pool


Skip to end of metadata

1.apply/apply_async方法,每次只能向进程池分配一个任务,那如果想一次分配多个任务到进程池中,可以使用map/map_async方法。首先来看下map_async方法是如何定义的:

apply/apply_async使用循环创建,

map/map_async太复杂,不建议使用,需要计算参数列表的个数https://www.cnblogs.com/Tour/p/4564710.html


2.当直接通过pool+queue进行多进程操作,程序不会响应,队列对象不能在父进程与子进程间通信,如果想要使用进程池中使用队列则要使用multiprocess的Manager类

 

备注:网上有人这样操作会有报错提示:RuntimeError: Queue objects should only be shared between processes through inheritance

 

#本来我想要的是将会得到一个队列,将其作为参数传入进程池子里的每个子进程
#直接pool+queue,程序无响应,pw,pr直接没有响应
#网上有人这样操作会有报错提示:RuntimeError: Queue objects should only be shared between processes through inheritance

 

from  multiprocessing  import  Process, Queue,Pool,Manager
import  os, time, random
 
# 写数据进程执行的代码:
def  write(q):
     for  value  in  [ 'A' 'B' 'C' ]:
         print (   'Put %s to queue...'  %  value)
         q.put(value)
         time.sleep(random.random())
 
 
# 读数据进程执行的代码:
def  read(q):
     while  True :
         if  not  q.empty():
             value  =  q.get( True )
             print ( 'Get %s from queue.'  %  value)
 
             time.sleep(random.random())
         else :
             break
 
 
if  __name__  = =  '__main__' :
     # 父进程创建Queue,并传给各个子进程:
     # 父进程创建Queue,并传给各个子进程:
     =  Queue()
     =  Pool()
     pw  =  p.apply_async(write, args = (q,))
     pr  =  p.apply_async(read, args = (q,))
     p.close()
     p.join()
     print ( '====================================' )
     print ( '所有数据都写入并且读完' )

 

#进程池中使用队列则要使用multiprocess的Manager类,用Manage的实例去定义queue,程序运行结果与预期一致

 

if  __name__  = =  '__main__' :
     # 父进程创建Queue,并传给各个子进程:
     # 父进程创建Queue,并传给各个子进程:
     manager  =  Manager()
     =  manager.Queue()
     =  Pool()
     pw  =  p.apply_async(write, args = (q,))
     pr  =  p.apply_async(read, args = (q,))
     p.close()
     p.join()
     print ( '====================================' )
     print ( '所有数据都写入并且读完' )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的multiprocessing模块提供了多种处理多进程的方式,其中之一就是使用Pool类来创建进程池。 使用Pool类的步骤如下: 1. 首先导入multiprocessing模块中的Pool类: ```python from multiprocessing import Pool ``` 2. 创建Pool对象,指定进程池中的进程数: ```python pool = Pool(processes=4) # 进程池中有4个进程 ``` 3. 使用Pool对象的map方法调用需要多进程处理的函数: ```python results = pool.map(my_function, my_list) ``` 其中,my_function是需要处理的函数,my_list是需要处理的数据列表。map方法会将my_list中的每一个元素依次传递给my_function函数进行处理,并将处理结果保存在results列表中。 4. 最后记得关闭进程池: ```python pool.close() pool.join() ``` 这样就完成了使用Pool类进行多进程处理的操作。注意,在使用Pool类时,需要注意内存占用问题,尽量避免出现内存泄漏等问题。 ### 回答2: Python中的multiprocessing模块提供了一种使用进程来并行执行任务的方法。其中,Pool类是multiprocessing模块中的一个重要组件,用于创建并管理进程池。 使用Pool可以很方便地实现多进程并行执行任务,具体步骤如下: 1. 首先,导入multiprocessing模块中的Pool类:`from multiprocessing import Pool` 2. 创建一个Pool实例,指定进程数量,可以使用默认的进程数量(与CPU核心数相同)或者自己指定。例如,创建一个由4个进程组成的进程池:`pool = Pool(4)` 3. 使用进程池的map()方法来提交任务。map()方法可以接受一个函数和一个可迭代对象作为参数,然后将可迭代对象中的每个元素依次作为参数传递给函数,并发地执行这些任务。示例:`result = pool.map(func, iterable)` 4. 进程池会根据系统资源自动创建和管理子进程,将任务分配给这些子进程进行并发执行。执行完成后,会返回一个结果列表,其中每个元素是对应任务的返回值。 5. 随着任务的完成,进程池会自动回收并终止子进程,释放系统资源。需要注意的是,在使用完进程池后,需要调用close()和join()方法来等待子进程结束并清理资源。示例:`pool.close()`和`pool.join()` Python的multiprocessing模块中的Pool类提供了便捷的多进程管理功能,可以大大提高程序的执行效率。适用于任务间相互独立且计算密集型的应用场景。但当任务之间存在依赖关系或需要共享数据时,需要进一步考虑进程间通信和同步的问题。 ### 回答3: Python中的多进程模块`multiprocessing`中,`Pool`类是一个用于管理进程池的工具。它可以帮助我们并行执行多个任务,提高程序的运行效率。 `Pool`类的主要方法包括以下几个: 1. `__init__(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None)`:初始化进程池,其中`processes`参数指定进程池中的进程数量,默认为CPU的核心数;`initializer`和`initargs`参数可以设置在每个子进程运行之前执行的初始化函数和它的参数;`maxtasksperchild`参数指定每个子进程完成多少个任务后再关闭并重新创建一个新的子进程。 2. `apply(func, args=(), kwds={})`:用于在进程池中同步地调用一个函数,并返回函数的执行结果,`args`和`kwds`是函数的参数。 3. `apply_async(func, args=(), kwds={}, callback=None)`:用于在进程池中异步地调用一个函数,返回一个`ApplyResult`对象,通过该对象的`get()`方法可以获取函数的执行结果。 4. `map(func, iterable, chunksize=None)`:将函数应用于可迭代对象中的每个元素,并返回执行结果的列表。如果指定了`chunksize`参数,则将可迭代对象分块处理。 5. `map_async(func, iterable, chunksize=None, callback=None)`:与`map()`方法类似,但是是异步地调用函数,返回一个`MapResult`对象。 6. `close()`:停止向进程池中添加新的任务。 7. `join()`:等待所有的子进程执行完毕。 通过使用`Pool`类,我们可以轻松地实现多个任务的并行执行,从而加快程序的运行速度。在使用时,需要注意合理设置进程数和合理利用`apply()`、`apply_async()`、`map()`等方法,根据任务的特点选择合适的调用方式,以达到最佳的性能和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值