Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python线程返回值_Python_Multithreading_Return - Fatal编程技术网

Python线程返回值

Python线程返回值,python,multithreading,return,Python,Multithreading,Return,我是一个新的线程,我有一个现有的应用程序,我想让一点更快地使用线程 我有几个返回到主Dict的函数,希望将它们发送到单独的线程,以便同时运行,而不是一次运行一个 我在谷歌上搜索了一下,但似乎找不到适合我现有代码的东西,需要一些帮助 我有大约六个函数返回到主目录,如下所示: parsed['cryptomaps'] = pipes.ConfigParse.crypto(parsed['split-config'], parsed['asax'], parsed['names']) 这里的问题是返

我是一个新的线程,我有一个现有的应用程序,我想让一点更快地使用线程

我有几个返回到主Dict的函数,希望将它们发送到单独的线程,以便同时运行,而不是一次运行一个

我在谷歌上搜索了一下,但似乎找不到适合我现有代码的东西,需要一些帮助

我有大约六个函数返回到主目录,如下所示:

parsed['cryptomaps'] = pipes.ConfigParse.crypto(parsed['split-config'], parsed['asax'], parsed['names'])
这里的问题是返回值。我知道我需要为此使用一个队列,但这六个函数中的每一个都需要一个队列,或者所有函数都需要一个队列。如果是后者,我将如何将返回与线程分开,并将返回分配给正确的Dict条目

这方面的任何帮助都会很好

John

您可以将(worker,data)的元组推送到队列以标识源。 另外请注意,由于全局解释器锁定,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()