Python 如何使用不同的线程启动两个算法,并且只获取第一个算法的输出来完成?

Python 如何使用不同的线程启动两个算法,并且只获取第一个算法的输出来完成?,python,multithreading,algorithm,python-3.x,python-multithreading,Python,Multithreading,Algorithm,Python 3.x,Python Multithreading,我有两种算法可以解决数独难题。第一种使用舞蹈链接算法(递归回溯的一种形式),另一种使用约束传播,然后使用递归回溯 我想用两个算法各自的线程开始这两个算法,我只希望从第一个到最后一个的输出。因为两个线程都有相同的输出(或者至少两个线程都有可接受的输出),所以我想从第一个线程得到答案,然后结束另一个线程 有时,其中一些算法可能需要100多秒才能完成完全使算法出错的谜题,但我还没有发现一个谜题同时让两种算法都出错 我需要将线程标记为守护进程吗?我用下面的代码得到了答案,我只是担心它没有达到我希望的效果

我有两种算法可以解决数独难题。第一种使用舞蹈链接算法(递归回溯的一种形式),另一种使用约束传播,然后使用递归回溯

我想用两个算法各自的线程开始这两个算法,我只希望从第一个到最后一个的输出。因为两个线程都有相同的输出(或者至少两个线程都有可接受的输出),所以我想从第一个线程得到答案,然后结束另一个线程

有时,其中一些算法可能需要100多秒才能完成完全使算法出错的谜题,但我还没有发现一个谜题同时让两种算法都出错

我需要将线程标记为守护进程吗?我用下面的代码得到了答案,我只是担心它没有达到我希望的效果

编辑:在进一步阅读之后,看起来我真的想使用多处理而不是线程。我将对两者进行测试,看看它们如何比较

import threading
import time
import queue

from dlx import dlx_solve
from norvig import norvig_solve

# Test grids:
grid1 = '003020600900305001001806400008102900700000008006708200002609500800203009005010300'
grid2 = '4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......'
hard1 = '.....6....59.....82....8....45........3........6..3.54...325..6..................'

def solve(algo, grid, worker_queue, id, stop_event):
    while not stop_event.is_set():

        ans = algo(grid)

        if not stop_event.is_set():
            worker_queue.put((ans, id))

        break


# queue for workers
worker_queue = queue.Queue()

# indicator for other threads to stop
stop_event = threading.Event()

# run workers
threads = []
threads.append(threading.Thread(target=solve, args=(dlx_solve, grid1, worker_queue, 'dlx', stop_event)))
threads.append(threading.Thread(target=solve, args=(norvig_solve, grid1, worker_queue, 'norvig', stop_event)))


for thread in threads:
    thread.start()

# this will block until the first element is in the queue
first_finished = worker_queue.get()

print(first_finished)

您没有设置stop_事件,但除此之外,您似乎已经解决了它。将线程标记为守护进程将在所有非守护进程线程退出时杀死它们,如果它们持有任何需要释放的资源,这可能是不好的,这意味着您必须杀死整个程序才能停止这些线程。哦,你的算法必须经常检查stop_事件,现在你似乎只在已经完成之后才检查它,而且你有一个循环,其中有一个无条件中断(根本不是循环,只是冗余),如果你的算法是纯python的(而不是在numpy中做繁重的工作)那么是的,您可能希望使用多个进程而不是线程。如何设置停止事件?因为我使用的是纯python多线程,所以实际上不会并行工作,对吗?解释器锁会阻止它吗?纯python和终止的需要(与自动退出信号相反)说明了多处理,是的。您应该为每个作业提供一个队列来存放结果,并在队列中出现某些内容时终止这两个进程。(使用multiprocessing.Queue,而不是Queue.Queue)--只有在C模块或其他程序中完成工作时(每个线程都在等待阻塞调用),线程才有帮助