使用队列时区分返回值和线程

时间:2013-12-28 13:31:47

标签: python multithreading queue

这是我的代码:

  queue=Queue.Queue()
    isbn=str(9789382711056)
    thread1= Thread(target = amazon, args=[isbn,queue])
    thread2= Thread(target = bookadda, args=[isbn,queue])
    thread3= Thread(target = infibeam, args=[isbn,queue])
    def jo():
        thread1.join()
        thread2.join()
        thread3.join()
    thread1.start()
    thread2.start()
    thread3.start()

   jo()

每个函数都将一个列表放入队列(queue.put(list))。 其中一个函数的代码:

def infibeam(isbn,queue):
    #b_price and b_avail are obtained from some where else
    blist =[b_price,b_avail]
    queue.put(blist) 

其他方法也与此类似。

我获取队列中的所有列表,但是如何知道哪个方法返回了哪个列表? 请帮我。这可能是一个非常愚蠢的问题,但我是python的新手。在此先感谢。

2 个答案:

答案 0 :(得分:3)

如果您使用multiprocessing.ThreadPool,则可以使用pool.map

import multiprocessing.pool as mpool

def worker(target, isbn):
    return target(isbn)

def amazon(isbn):
    ...

def bookadda(isbn):
    ...

def infibeam(isbn):
    #b_price and b_avail are obtained from some where else
    return [b_price, b_avail]


pool = mpool.ThreadPool()
isbn = str(9789382711056)
args = [(target, isbn) for target in (amazon,bookadda,infibeam)]
result = pool.map(worker, args)

multiprocessing.ThreadPoolmultiprocessing.Pool具有相同的API,但池由线程而不是进程组成。

result中的项目顺序与args中的项目顺序相对应。


在Python3中,您可以使用concurrent.futures.ThreadPoolExecutor

import concurrent.futures as CF

with CF.ThreadPoolExecutor() as executor:
    future = executor.map(worker, args)
    result = list(future)

文档中还有an example using ThreadPoolExecutor,显示如何将参数与结果相关联。

答案 1 :(得分:1)

让每个线程使用唯一标记(字符串,线程函数本身等)标记其返回值。然后让主线程检查标签以确定哪个函数产生了哪个列表。

作为上述的变体,让线程函数将其返回值放入字典中(同样,通过某种类型的唯一标记键入)。