5

我想通过启动几个独立的异步操作线程来加速脚本的执行,否则这些线程会一个接一个地启动。

我使用了 concurrent.future 文档中的示例并将其改编为我的代码:

import concurrent.futures

def myfunc(elem):
    elem['ascii'] = ord(elem['name'])

mylist = [
    {'name': 'a'},
    {'name': 'b'},
    {'name': 'c'},
    {'name': 'd'},
    {'name': 'e'}
    ]

with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    future_to_url = {executor.submit(myfunc, elem): elem for elem in mylist}
    for future in concurrent.futures.as_completed(future_to_url):
        try:
            future.result()
        except Exception as exc:
            print('error: '.format(exc))

print mylist

代码按预期工作,但我是否应该担心并发访问mylist或是否正确锁定并以串行方式访问(或任何正确的数据以保持一致)?

在实际程序中,字典会更大,我想启动约 500 名工人。

4

1 回答 1

0

我想通过启动多个线程来加速脚本的执行

由于CPython 的实现带来的挑战ProcessPoolExecutor,如果您对性能感兴趣,您可能应该使用。请注意,这将需要在工作人员如何与应该共享的数据结构进行通信和/或交互方面更加复杂的设计。

现在,关于你的问题:

我应该担心对 mylist 的并发访问还是是否被正确锁定并以串行方式访问(或任何正确的方式以使数据保持一致)

它将在多线程list环境中正常运行,但如果您有任何需要原子性的语义分层,您将需要自己的锁定。比如说,你的设计要求/期望应该总是有七个元素,一些工人会做 a后跟一个. 您将需要自己的锁来保护工作人员免受它们之间的并发访问。listpop()append()

于 2013-11-13T19:31:08.327 回答