这是我的代码:
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的新手。在此先感谢。
答案 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.ThreadPool
与multiprocessing.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)
让每个线程使用唯一标记(字符串,线程函数本身等)标记其返回值。然后让主线程检查标签以确定哪个函数产生了哪个列表。
作为上述的变体,让线程函数将其返回值放入字典中(同样,通过某种类型的唯一标记键入)。