【问题标题】:Python Concurrency ThreadPoolExecutor - stop execution if condition is metPython并发ThreadPoolExecutor - 如果满足条件则停止执行
【发布时间】:2020-01-16 07:17:59
【问题描述】:

我一直在尝试使用 ThreadPoolExecutor 进行多线程,如果其中一个进程满足某个条件,则可以安全地停止执行,这样剩余的线程就不必最终确定。

我有以下概念,但它不起作用,它一直在运行:

import time, sys
from concurrent.futures import ThreadPoolExecutor

data = {"future1": 'blank', "future2": 'blank', "future3": 'blank'}

def function1(n):
   global data #not sure if this is necessary, as it seems to be able to access this anyway?
   print(n)
   time.sleep(1)
   data['future1'] = n

def function2(n):
   global data
   print(n)
   time.sleep(2)
   data['future2'] = n

def function3(n):
   global data
   print(n)
   time.sleep(3)
   data['future3'] = n

with ThreadPoolExecutor(max_workers=4) as executor:
  while True:
    future1=executor.submit(function1, 'test1')
    future2=executor.submit(function2, 'test2')
    future3=executor.submit(function3, 'test3')

    if data['future2']!='blank':
      executor.shutdown(wait=False)
      sys.exit()

不知道我在这里做错了什么,任何帮助将不胜感激。

【问题讨论】:

    标签: python multithreading concurrency threadpoolexecutor


    【解决方案1】:

    这是完整的答案,事实证明 executor.shutdown(wait=False) 不是 Sachin 提到的要走的路。完全归功于https://gist.github.com/clchiou/f2608cbe54403edb0b13

    import time, sys
    from concurrent.futures import ThreadPoolExecutor
    import concurrent.futures.thread
    
    data = {"future1": None, "future2": None, "future3": None}
    
    def function1(n):
       time.sleep(1)
       data['future1'] = n
       print(n)
    
    def function2(n):
       time.sleep(2)
       data['future2'] = n
       print(n)
    
    def function3(n):
       time.sleep(3)
       data['future3'] = n
       print(n)
    
    with ThreadPoolExecutor(max_workers=4) as executor:
      executor.submit(function1, 'test1')
      executor.submit(function2, 'test2')
      executor.submit(function3, 'test3')
    
      while True:
        if any(v is not None for v in data.values()):
          executor._threads.clear()
          concurrent.futures.thread._threads_queues.clear()
          break
    
    print(data)
    

    【讨论】:

      【解决方案2】:

      您正在while True: 循环中运行线程,该循环一次又一次地启动调用。

      with ThreadPoolExecutor(max_workers=4) as executor:
      
          future1=executor.submit(function1, 'test1')
          future2=executor.submit(function2, 'test2')
          future3=executor.submit(function3, 'test3')
      
          while True:
              if data['future2']!='blank':
                  executor.shutdown(wait=False)
                  sys.exit()
      

      executor.shutdown(wait=False) 仍然会等待其子进程完成

      【讨论】:

      • Thx 这至少退出了循环,尽管在所有子进程都完成之后,这正是我不想要的。有没有办法让它在满足中断条件后立即停止?
      猜你喜欢
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多