【问题标题】:Searching in array with threads使用线程在数组中搜索
【发布时间】:2016-01-27 23:21:58
【问题描述】:

假设我正在使用 Python,尽管它并不真正相关。

我有一个大数组,我想查找元素 x 是否在数组中。

但是,当其中一个线程找到元素时,我希望所有其他线程都停止,
他们没有必要继续运行。我想用结果继续主程序。

这样做的正确方法是什么? 在我已经发现元素确实存在之后,我想尽量减少其他线程的cpu时间。

【问题讨论】:

    标签: python multithreading parallel-processing operating-system


    【解决方案1】:

    在 Python 中,您可以在主线程中创建一个thread-safe queue 并将其传递给每个工作线程。每个工作人员都应该在队列为empty() 时进行搜索,然后终止。如果找到结果,幸运的工作人员应该将其put() 放入队列,导致所有其他工作人员在当前迭代后停止。

    示例代码(未经测试):

    from Queue import Queue
    from Threading import Thread
    
    class Worker(Thread):
        def __init__(self, queue):
            self.queue=queue
    
        def run(self):
            while self.queue.empty():
                result=search( ... )
                if result:
                    queue.put(result)
    
    def main():
        queue=Queue()
        workers=[]
        for i in xrange(0,5):
            workers.append(Worker(queue))
        result=queue.get()
        print result
    

    【讨论】:

    • 循环检查队列是否为空不是“浪费时间”吗?那时其他线程似乎可以继续搜索。除了这个,还有更优雅的解决方案吗?
    • 我是否正确地假设您的反对归结为一个线程是否可以随时停止的问题,而不是在当前迭代之后终止它?简短的回答:不鼓励这样做。 stackoverflow.com/questions/323972/…
    • 所以如果我想像他们建议的那样杀死 10 个线程,我将不得不对它们进行迭代,但有可能在迭代的中间,剩余的线程之一将获得控制并浪费时间(搜索时)。
    • 如果一次搜索迭代是一项昂贵的操作,您可以考虑将其拆分,在该操作期间多次检查取消条件。而不是检查每个工作人员中的队列,可以检查一个取消标志实例变量,该变量是在读取结果后由主线程设置的(但我怀疑这会产生很大的不同)。
    • 我在问一个理论问题:我怎样才能以最好和正确的方式停止 10 个线程?
    【解决方案2】:

    有多种方法,其中之一是在调用者的线程中轮询队列,生成的线程存储它们的结果。一旦出现第一个结果,就终止所有正在运行的线程。

    请注意,由于全局解释器锁的限制,在 CPython 中只能同时运行一个线程(除非在 C 扩展中可以释放锁)。另请注意,对于在大数据中搜索更合适的数据结构,应使用数组,如二叉树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 2017-03-14
      相关资源
      最近更新 更多