Python Pool 多进程

我们在使用Python时,会经常需要使用多进程/多线程的情况,以便提高程序的运行效率,尤其是跟网络进行交互,如使用爬虫时。下面我们将简单看下Python的进程池的创建,map()、apply_async()、apply()的使用。

Pool

可以创建一个进程池,里面是一些工作者进程(Workers),向其提交任务。

创建

class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]]

  •  processes:工作进程的数量,如果为None那么processes的值为os.cpu_count()返回的数量,即CPU的个数。
  •  initializer: 如果initializer是None,那么每一个工作进程在开始的时候会调用initializer(*initargs)。
  •  maxtasksperchild:工作进程退出之前可以完成的任务数,完成后用一个新的工作进程来替代原进程,来让闲置的资源被释放。maxtasksperchild默认是None,意味着只要Pool存在工作进程就会一直存活。
  •  context:用在制定工作进程启动时的上下文,一般使用 multiprocessing.Pool() 或者一个context对象的Pool()方法来创建一个池,两种方法都适当的设置了context。

成员函数

  • apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞。
  • apply(func[, args[, kwds]])是阻塞的。
  • close() 关闭pool,使其不在接受新的任务。
  • terminate() 关闭pool,结束工作进程,不在处理未完成的任务。
  • join() 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用。

map

map(funciterable[, chunksize])  

  这种方法将iterable对象分成一些块,作为单独的任务提交给进程池。 这些块的(近似)大小可以通过将chunksize设置为正整数来指定。

Python
#!/usr/bin/env <span class="wp_keywordlink"><a href="http://www.168seo.cn/python" title="python">python</a></span> # -*- coding:utf-8 -*- from <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/multiprocessing" title="View all posts in multiprocessing" target="_blank">multiprocessing</a></span> import Pool import time def test(i): print i time.sleep(1) if __name__ == '__main__': list = [1,2,3,4,5,6,7,8,9] pool = Pool(processes=2) pool.map(test, list) pool.close() pool.join()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from multiprocessing import Pool
import time
 
def test ( i ) :
     print i
     time . sleep ( 1 )
 
 
if __name__ == '__main__' :
     list = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
     pool = Pool ( processes = 2 )
     pool . map ( test , list )
     pool . close ( )
     pool . join ( )

apply

apply(func[, args[, kwds]])

  创建的进程会去执行func函数,并且传递参数args和关键字参数kwds,阻塞型,其实可以看成是单进程,一个执行完毕之后才会执行下一个。

Sample:

Python
#!/usr/bin/env python # -*- coding:utf-8 -*- from multiprocessing import Pool import time def test(i): print i time.sleep(1) if __name__ == '__main__': pool = Pool(processes=10) for i in range(1, 100, 1): # print i pool.apply(test, args=(i,)) print 'test' pool.close() pool.join()</span>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from multiprocessing import Pool
import time
 
def test ( i ) :
     print i
     time . sleep ( 1 )
 
 
if __name__ == '__main__' :
     pool = Pool ( processes = 10 )
     for i in range ( 1 , 100 , 1 ) :
         # print i
         pool . apply ( test , args = ( i , ) )
 
     print 'test'
 
     pool . close ( )
     pool . join ( ) < / span >

apply_async

apply_async(func[, args[, kwds[, callback[, error_callback]]]])

  是上面介绍apply的非阻塞版/异步版。

Sample:

Python
#!/usr/bin/env python # -*- coding:utf-8 -*- from multiprocessing import Pool import time def test(i): print i time.sleep(1) if __name__ == '__main__': pool = Pool(processes=10) for i in range(1, 100, 1): # print i pool.apply_async(test, args=(i,)) print 'test' pool.close() pool.join()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from multiprocessing import Pool
import time
 
def test ( i ) :
     print i
     time . sleep ( 1 )
 
 
if __name__ == '__main__' :
     pool = Pool ( processes = 10 )
     for i in range ( 1 , 100 , 1 ) :
         # print i
         pool . apply_async ( test , args = ( i , ) )
 
     print 'test'
 
     pool . close ( )
     pool . join ( )

apply_async可能也是我们倾向于使用的,大家可以分别运行一下示例,对比看看它们之间的不同。




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
### 回答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、付费专栏及课程。

余额充值