【问题标题】:Python threading return valuesPython 线程返回值
【发布时间】:2014-11-01 09:48:55
【问题描述】:

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

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

我做了一些谷歌搜索,但我似乎找不到适合我现有代码的东西并且可以使用一些帮助。

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

parsed['cryptomaps'] = pipes.ConfigParse.crypto(parsed['split-config'], parsed['asax'], parsed['names'])

这里的问题在于返回值。我知道我需要为此使用一个队列,但我需要为这六个函数中的每一个函数创建一个队列,还是为所有这些函数创建一个队列。如果是后者,我将如何将返回与线程分开并将其分配给正确的 Dict 条目。

在这方面的任何帮助都会很棒。

约翰

【问题讨论】:

    标签: python multithreading return


    【解决方案1】:

    您可以将 (worker, data) 的元组推送到队列以识别源。 另请注意,由于 Global Interpreter Lock,Python 线程不是很有用。我建议看一下 multiprocessing 模块,它提供与多线程非常相似的接口,但实际上会随着工作人员的数量而扩展。

    编辑:

    代码示例。

    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()
    

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2018-07-03
      • 2013-11-06
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多