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

Inb*_*ose 4 python queue multithreading

我想要做的是能够调用多个线程的函数并获得他们的结果.

我有以下代码:

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

from threading import Thread
import time
import Queue

#an example - actual code connects to a server
def str_to_int(arg, queue):
    result = 0
    result = int(arg)
    #sleep to check that they happen at once.
    time.sleep(10)
    queue.put(result)

def combine():
    q1 = Queue.Queue()
    q2 = Queue.Queue()
    q3 = Queue.Queue()

    t1 = Thread(target = str_to_int, args=("111", q1))
    t2 = Thread(target = str_to_int, args=("222", q2))
    t3 = Thread(target = str_to_int, args=("333", q3))

    t1.start()
    t2.start()
    t3.start()

    t1.join()
    t2.join()
    t3.join()

    return (q1.get(),q2.get(),q3.get())

print combine()
Run Code Online (Sandbox Code Playgroud)

这段代码有效.我得到了预期的结果:

>>> 
(111, 222, 333)
Run Code Online (Sandbox Code Playgroud)

但是,必须有更好的方法来做到这一点.我计划拥有比3更多的线程,但即使我只留在3 - 它似乎非常难看.

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

Ros*_*nko 6

以下是一些建议:

  1. Queue是线程安全的,所以使用1队列来传递结果.
  2. 您可以在一个循环中创建所有线程并使用队列来传递结果.您不需要为每个线程都有显式变量.

所以这是你的代码可能是这样的:

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))]
Run Code Online (Sandbox Code Playgroud)