python中的线程(多线程)

python中的线程(多线程),python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,如果我有7个方法和2个线程。方法1和方法2需要由2个线程(线程1、线程2)执行。取决于哪个线程首先完成。例如:如果线程2首先完成执行,它应该选择方法3执行,线程1应该选择方法4,并且它应该继续执行,直到所有7个方法都执行完毕。有没有办法做到这一点?非常感谢任何参考是的,您可以简单地将方法放入队列中,让两个线程竞争执行方法: 导入线程,队列 def工人(q): 尽管如此: 方法=q.get() 如果不是,方法: 返回 方法() q=队列。队列() 方法=[m1、m2、m3、m4、m5、m6、m7]

如果我有7个方法和2个线程。方法1和方法2需要由2个线程(线程1、线程2)执行。取决于哪个线程首先完成。例如:如果线程2首先完成执行,它应该选择方法3执行,线程1应该选择方法4,并且它应该继续执行,直到所有7个方法都执行完毕。有没有办法做到这一点?非常感谢任何参考

是的,您可以简单地将方法放入队列中,让两个线程竞争执行方法:

导入线程,队列
def工人(q):
尽管如此:
方法=q.get()
如果不是,方法:
返回
方法()
q=队列。队列()
方法=[m1、m2、m3、m4、m5、m6、m7]
对于方法中的方法:
q、 put(方法)
threads=[threading.Thread(target=worker,args=(q,))用于范围(2)]
对于线程中的线程:
q、 put(无)#包括每个线程的终止信号
thread.start()
对于线程中的线程:
thread.join()

是的,您可以简单地将方法放入队列中,让两个线程竞争执行方法:

导入线程,队列
def工人(q):
尽管如此:
方法=q.get()
如果不是,方法:
返回
方法()
q=队列。队列()
方法=[m1、m2、m3、m4、m5、m6、m7]
对于方法中的方法:
q、 put(方法)
threads=[threading.Thread(target=worker,args=(q,))用于范围(2)]
对于线程中的线程:
q、 put(无)#包括每个线程的终止信号
thread.start()
对于线程中的线程:
thread.join()

除了来自另一个答案的基于队列的解决方案外,您还可以使用优秀的
并发.futures
模块为您完成繁重的工作:

with concurrent.futures.ThreadPoolExecutor(2) as pool:
    for m in methods:
        pool.submit(m)
线程池上的
submit()
方法将任务提交到池中,并返回一个对象(不要与同名的asyncio类型混淆),该对象允许您查询特定任务是否完成,等待任务完成,并获取结果


如果您不执行任何操作,则带的
块将自动等待所有提交的任务在块末尾完成。

除了来自另一个答案的基于队列的解决方案外,您还可以使用优秀的
并发.futures
模块为您完成繁重的工作:

with concurrent.futures.ThreadPoolExecutor(2) as pool:
    for m in methods:
        pool.submit(m)
线程池上的
submit()
方法将任务提交到池中,并返回一个对象(不要与同名的asyncio类型混淆),该对象允许您查询特定任务是否完成,等待任务完成,并获取结果


如果您不执行任何操作,则
with
块将自动等待所有提交的任务在块末尾完成。

由@user4815162342提交的答案当然是一种简单的方法,但我想我会向您展示与
多处理.pool
模块相同的方法:

从multiprocessing.pool导入线程池
使用线程池(2)作为池:
对于m in方法:
pool.apply\u async(m)
pool.close()
pool.join()
apply\u asyc
方法返回一个
AsyncResult
对象,可以调用该对象的
get
方法来等待提交的“任务”完成,并在调用的方法返回任何感兴趣的内容时获取返回值。否则,调用
pool.close()
,然后调用
pool.join()
将被阻止,直到所有提交的任务完成。如果这些方法确实返回了您感兴趣的值,那么您应该保存
apply\u async
返回的
AsyncResult
对象,并对它们调用
get
。在这种情况下,实际上不再需要调用
close
join

使用线程池(2)作为池:
结果=[pool.apply_async(m)for m in methods]
return_values=[result.get()用于result in results]
with
块的末尾,池中的所有线程都将与已提交的任何任务一起终止,即
pool.terminate()
被隐式调用(与等待未完成任务完成的
concurrent.futures
模块不同)

澄清

有两个并行类,一个用于进程池:

来自多处理导入池的

#或从多处理器inf.pool导入池
一个用于线程池:

从multiprocessing.pool导入线程池
#或来自multiprocessing.dummy导入池

它们应该具有相同的API(事实上,它们确实如此)。但是,在线程池的情况下,
pool.terminate()
不能实际终止线程,因为没有终止线程的方法。因此,如果线程在显式或隐式调用
pool.terminate()
时已经在运行提交的任务,它可能会继续运行。

由@user4815162342提交的答案当然是一个简单的方法,但我想我会向您展示与
多处理.pool
模块相同的方法:

从multiprocessing.pool导入线程池
使用线程池(2)作为池:
对于m in方法:
pool.apply\u async(m)
pool.close()
pool.join()
apply\u asyc
方法返回一个
AsyncResult
对象,可以调用该对象的
get
方法来等待提交的“任务”完成,并在调用的方法返回任何感兴趣的内容时获取返回值。否则,调用
pool.close()
,然后调用
pool.join()
将被阻止,直到所有提交的任务完成。如果这些方法确实返回了您感兴趣的值,那么您应该保存
apply\u async
返回的
AsyncResult
对象,并对它们调用
get
。在这种情况下,实际上不再需要调用
close