Python 线程返回值
我刚接触线程编程,想让我的应用程序运行得更快,所以打算用线程来加速。
我有几个函数,它们的结果会返回到一个主字典里。我想把这些函数放到不同的线程中,让它们同时运行,而不是一个接一个地执行。
我查了一些资料,但似乎找不到适合我现有代码的解决方案,希望能得到一些帮助。
我大约有六个函数,它们的返回值都是放到主字典里的,像这样:
parsed['cryptomaps'] = pipes.ConfigParse.crypto(parsed['split-config'], parsed['asax'], parsed['names'])
这里的问题在于返回值。我知道我需要使用队列来处理这些返回值,但我需要为这六个函数每个都准备一个队列,还是只用一个队列就可以?如果是后者,我该怎么把线程的返回值分开,并正确地放到字典的对应位置呢?
如果能提供一些帮助,那就太好了。
约翰
1 个回答
1
你可以把包含(工作者,数据)这对组合的元组放到队列里,这样就能知道数据的来源了。还有一点要注意,由于Python有个叫全局解释器锁的东西,线程在Python里并不是特别好用。我建议你看看多进程模块,它的使用方式和多线程很像,但实际上能更好地利用多个工作者。
编辑:
代码示例。
import multiprocessing as mp
# py 3 compatibility
try:
from future_builtins import range, map
except ImportError:
pass
data = [
# input data
# {split_config: ... }
]
def crypto(split_config, asax, names):
# your code here
pass
if __name__ == "__main__":
terminate = mp.Event()
input = mp.Queue()
output = mp.Queue()
def worker(id, terminate, input, output):
# use event here to graciously exit
# using Process.terminate would leave queues
# in undefined state
while not terminate.is_set():
try:
x = input.get(True, timeout=1000)
output.put((id, crypto(**x)))
except Queue.Empty:
pass
workers = [mp.Process(target=worker, args=(i, )) for i in range(0, mp.cpu_count())]
for worker in workers:
worker.start()
for x in data:
input.put(x)
# terminate workers
terminate.set()
# process results
# make sure that queues are emptied otherwise Process.join can deadlock
for worker in workers:
worker.join()