Python并行化操作

Python并行化操作

ThreadPoolExecutor/ProcessPoolExecutor

ProcessPoolExecutor 和 ThreadPoolExecutor语法一样,但是 ProcessPoolExecutor 往往会遇到各种bug。

submit/as_completed

这种方式返回的result的顺序,和提交任务的顺序,并不对应。后提交的可能先完成。因此需要写代码重新调整顺序。

import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://nonexistant-subdomain.python.org/']

# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()

# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))

concurrent.futures.ThreadPoolExecutor(),默认使用所有进程。

map/imp

  • executor.map:该方法将可迭代任务集合划分为多个子任务,并使用多个线程或多个进程并发地执行这些子任务。它返回一个迭代器,该迭代器按照原始任务集合的顺序返回每个子任务的结果。executor.map方法会等待所有任务都完成,并按照任务的顺序返回结果。如果某个任务出现异常,executor.map方法会将该异常重新抛出。
  • executor.imap:该方法将可迭代任务集合划分为多个子任务,并使用多个线程或多个进程并发地执行这些子任务。它返回一个迭代器,该迭代器在任务完成时逐个地返回结果。executor.imap方法会立即返回一个迭代器对象,而不会等待所有任务都完成。当遍历迭代器时,它会按照任务完成的顺序返回结果。如果某个任务出现异常,该异常会在迭代器中被引发。

multiprocessing

multiprocessing 是一个使用类似于 threading 模块的 API 支持生成进程的包。 multiprocessing 包提供本地和远程并发,通过使用子进程而不是线程有效地回避全局解释器锁。因此, multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。它可以在 POSIX 和 Windows 上运行。

multiprocessing 模块还引入了 threading 模块中没有类似的 API。一个典型的例子是 Pool 对象,它提供了一种方便的方法来跨多个输入值并行执行函数,跨进程分配输入数据(数据并行性)。以下示例演示了在模块中定义此类函数以便子进程可以成功导入该模块的常见做法。这是使用 Pool 的数据并行性的基本示例,

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值