Python 从多个线程获得结果的更好方法

Python 从多个线程获得结果的更好方法,python,multithreading,queue,Python,Multithreading,Queue,我想做的是能够调用具有多个线程的函数并获得它们的结果 我有以下代码: (这是一个示例,实际代码并不简单地将str转换为int) 这个代码有效。我得到了预期的结果: >>> (111, 222, 333) 然而,必须有更好的方法来做到这一点。 我计划有更多的线程比3,但即使我只是停留在3-它似乎非常丑陋 编辑:我需要知道哪个结果来自哪个线程(即:我给出函数的参数/参数)以下是一些建议: 队列是线程安全的,因此使用1个队列传递结果 您可以在一个周期中创建所有线程,并使用队列传递

我想做的是能够调用具有多个线程的函数并获得它们的结果

我有以下代码:

(这是一个示例,实际代码并不简单地将str转换为int)

这个代码有效。我得到了预期的结果:

>>> 
(111, 222, 333)
然而,必须有更好的方法来做到这一点。 我计划有更多的线程比3,但即使我只是停留在3-它似乎非常丑陋

编辑:我需要知道哪个结果来自哪个线程(即:我给出函数的参数/参数)

以下是一些建议:

  • 队列
    是线程安全的,因此使用1个队列传递结果
  • 您可以在一个周期中创建所有线程,并使用队列传递结果。对于每个线程,不需要显式变量
  • 因此,您的代码可能是这样的:

    def str_to_int(arg, queue):
        result = int(arg)
        queue.put({arg: result})
    
    def combine():
        arguments = ('111', '222', '333')
        q = Queue.Queue()
        threads = []
    
        for argument in arguments:
            t = Thread(target=str_to_int, args=(argument, q))
            t.start()
            threads.append(t)
    
        for t in threads:
            t.join()
    
        return [q.get() for _ in xrange(len(arguments))]
    
    我需要能够知道哪个结果来自哪个线程(即:我给函数的参数/参数)

    我使用这样的函数来跟踪哪个结果来自哪个任务:

    从线程导入线程
    导入键入
    def一起运行(任务:typing.Dict[typing.Hashable,tuple],
    除了错误:tuple=None)->dict:
    """
    :param tasks:与可调用的元组及其参数匹配的任务键的dict
    其中:

    {'result:0':1,'result:1':2,'result:2':3,'result:3':4}
    
    您可能需要移动t.join()按钮,进入自己的循环,否则线程将连续运行。这不起作用。正如@AustinPhillips所说,线程彼此紧跟而不是同时运行。是的,我的错误,线程必须在单独的循环中加入,因为加入会导致主线程阻塞。嗯-抱歉,我将其标记为已接受,但后来我意识到这会导致问题m代表我。我现在如何获得不同的结果,并能够知道我正在处理哪一个?您不仅可以将结果放入队列,还可以将指向参数的内容放入队列。将({argument:resut})放入您的worker函数。我已使用修改的str_to_int函数更新了post
    def str_to_int(arg, queue):
        result = int(arg)
        queue.put({arg: result})
    
    def combine():
        arguments = ('111', '222', '333')
        q = Queue.Queue()
        threads = []
    
        for argument in arguments:
            t = Thread(target=str_to_int, args=(argument, q))
            t.start()
            threads.append(t)
    
        for t in threads:
            t.join()
    
        return [q.get() for _ in xrange(len(arguments))]