python进程池调用实例方法_multiprocessing在python中的高级应用-进程池

下面的类可以创建进程池,可以吧各种数据处理任务都提交给进程池。进程池提供的功能有点类似于列表解析和功能性编程操作(如映射-规约)提供的功能。

Pool( [ numprocess [, initializer [, initargs] ] ] )

创建工作进程池。

numprocess是要创建的进程数。如果省略此参数,将使用cpu_count()的值。【这里简单介绍一下:

from multiprocessing import cpu_count

print(cpu_count()) #获得电脑的CPU的个数

】。

initializer是每个工作进程启动时要执行的可调用对象。initargs是要传递给initializer的参数元组。initializer默认为None。

Pool类的实例p支持一下操作:

p.apply(func [, args[, kwargs] ] )

在一个池工作进程中执行函数(*args,**kwargs),然后返回结果。这里要强调一点:此操作并不会在所有池工作进程中并行执行func函数。如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async()函数。

p.apply_async( func [, args [, kwargs [, callback] ] ] )

在一个池工作进程中异步地执行函数(*args,**kwargs),然后返回结果。此方法的结果是AsyncResult类的实例,稍后可用于获得最终结果。callback禁止只习惯任何阻塞操作,否则将阻塞接收其他异步操作中的结果。

p.close()

关闭进程池,防止进行进一步操作。如果所有操作持续挂起,他们将在工作进程终止之前完成。

p.join()

等待所有工作进程退出。此方法只能在close()或terminate()方法之后调用。

p.imap(func, iterable [, chunksize] )

map()函数的版本之一,返回迭代器而非结果列表。

p.imap_unordered(func, iterable [,chunksize] )

同imap()函数,但从工作进程接收结果时,返回结果的次序时任意的。

p.map(func, iterable [, chunksize] )

将可调用对象func应用给iterable中的所有项目,然后以列表的形式返回结果。通过将iterable划分为多块并将工作分派给工作进程,可以并行地执行这项操作。chunksize制定每块中的项目数。

如果数据量较大,可以增大chunksize的值来提升性能。

p.map_async( func , iterable [, chunksize [, callback] ] )

同map()函数,但结果的返回时异步地。如果提供callable参数,当结果变为可用时,它将与结果一起被调用。

p.terminate()

立即终止所有工作进程,同时不执行任何清理或结束任何挂起工作。如果p被垃圾收集,将自动调用此函数。

方法apply_async()和map_async()的返回值是AsyncResult实例。AsyncResult实例具有以下方法。

a.get( [timeout] )

返回结果,如果有必要则等待结果到达。timeout是可选的超时。如果结果在制定时间内没有到达,将引发multuprocessing.TimeoutError异常。如果远程操作中引发了异常,它将在调用此方法时再次被引发。

a.ready()

如果调用完成,返回True

a.sucessful()

如果调用完成且没有引发异常,返回True。如果在结果就绪之前调用此方法,将引发AssertionError异常。

a.wait( [ timeout] )

等待结果变为可用。timeout是可选的超时。

下面的例子说明如何使用进程池构建字典,将整个目录中文件的文件名映射为SHA512摘要值:

import multiprocessing

import os

import hashlib

#Some parameters you can tweek

BUFSIZE=8192 #读取缓冲区大小

POOLSIZE=4

def compute_digest(filename):

try:

f=open(filename,"rb")

except IOError:

return None

digest=hashlib.sha512()

while True:

chunk=f.read(BUFSIZE)

if not chunk:break

digest.update(chunk)

f.close()

return filename,digest.digest()

def build_digest_map(topdir):

digest_pool=multiprocessing.Pool(4)

allfiles=(os.path.join(path,name)

for path,dirs,files in os.walk(topdir)

for name in files)

digest_map=dict(digest_pool.imap_unordered(compute_digest,allfiles,20))

digest_pool.close()

return digest_map

if __name__=="__main__":

digest_map=build_digest_map("F:\WaterFlow")

print len(digest_map)

在这个例子中,使用生成器表达式指定一个目录树中所有文件的路径名称序列。然后使用imap_unordered()函数将这个序列分割并传递给进程池。每个池工作进程使用compute_digest()函数为它的文件计算SHA512摘要值。将结果返回给生成器,然后收集到python字典中。

要记住,只有充分利用了池工作进程才能够使额外的通信开销变得有价值,使用进程池才有意义。一般而言,对于简单的计算(如两个数相加),使用进程池是没有意义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonmultiprocessing.Pool模块和multiprocessing.dummy.Pool模块都是用于创建进程和线程的工具。 进程(multiprocessing.Pool)是一组维护在进程的工作者,它们可以并行地执行任务。该模块是基于multiprocessing模块实现的,它通过创建多个进程来并行执行任务。 下面是一个创建进程的示例: ``` python import multiprocessing def worker(process_num): print("Process %d is working" % process_num) if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) for i in range(5): pool.apply_async(worker, args=(i,)) pool.close() pool.join() ``` 上面的示例,我们创建了一个包含4个进程进程,并向进程池中提交了5个任务,每个任务调用worker函数并传递一个进程编号作为参数。我们使用apply_async方法进程池中提交任务,并使用close和join方法管理进程。 线程(multiprocessing.dummy.Pool)是一组维护在线程的工作者,它们可以并行地执行任务。该模块是基于threading模块实现的,它通过创建多个线程来并行执行任务。 下面是一个创建线程的示例: ``` python from multiprocessing.dummy import Pool import time def worker(thread_num): print("Thread %d is working" % thread_num) time.sleep(1) if __name__ == '__main__': pool = Pool(4) for i in range(5): pool.apply_async(worker, args=(i,)) pool.close() pool.join() ``` 上面的示例,我们创建了一个包含4个线程的线程,并向线程池中提交了5个任务,每个任务调用worker函数并传递一个线程编号作为参数。我们使用apply_async方法向线程池中提交任务,并使用close和join方法管理线程。 需要注意的是,线程进程的用法基本相同,但是由于线程在Python不能真正地并行执行,因此线程的性能可能比进程差。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值