我是新手来处理我现有的应用程序,我想使用线程更快一点。
我有几个返回主Dict的函数,并希望将它们发送到不同的线程,以便同时运行而不是一次运行。
我做了一些谷歌搜索,但我似乎找不到适合我现有代码的东西,可以使用一些帮助。
我有大约六个函数返回到主Dict,如下所示:
parsed['cryptomaps'] = pipes.ConfigParse.crypto(parsed['split-config'], parsed['asax'], parsed['names'])
这里的问题是返回值。我知道我需要为此使用一个队列,但是我需要为这六个函数中的每个函数设置一个队列,或者为所有这些函数需要一个队列。如果是后者,我将如何从线程中分离返回并将其分配给正确的Dict条目。
对此的任何帮助都会很棒。
约翰
答案 0 :(得分:1)
您可以将(worker,data)的元组推送到队列以识别源。 另请注意,由于Global Interpreter Lock 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()