【问题标题】:Threading / Queue in PythonPython中的线程/队列
【发布时间】:2011-08-16 07:42:57
【问题描述】:

我打算在 python 2.5.2 中使用线程/队列 但似乎 python 在 queue.join() 命令处被冻结。 以下代码的输出仅为:BEFORE

import Queue
import threading

queue = Queue.Queue()

class ThreadUrl(threading.Thread):

    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:

            i = self.queue.get()
            print i
            self.queue.task_done()


def main():

    for i in range(5):
        t = ThreadUrl(queue)
        t.setDaemon(True)
        t.start()

    for i in range(5):
        queue.put(i)

    print "BEFORE"
    queue.join()
    print "AFTER"


main()

有人知道出了什么问题吗?

【问题讨论】:

  • queue.put(1) ...并不是说这是解决方案。但只需检查所有函数的 id(queue) 是否相同......如果不是,则在函数中使用全局队列......
  • 在 Windows 上使用 Python 2.6.6 对我来说效果很好
  • 这段代码看起来非常完美,我整天都在读这种东西:\
  • @Eli - 我不认为这是复制粘贴错误,我认为这是他真正的错误。
  • @agf: 嗯,如果是这样,那很好:)

标签: python multithreading queue


【解决方案1】:

我认为是t.setDaemon(True) 部分。

所以在 Python > 2.6 中,使用:

t.setDaemon(True)

在 Python

t.daemon = True

【讨论】:

    【解决方案2】:

    您的 ThreadUrl 类的 run() 方法缩进太远。结果,线程永远不会启动。如果您将 run 方法的缩进与 init() 置于相同的缩进级别,它将正常工作。

    【讨论】:

    • 感谢您的提示。但是现在在调用 queue.put(i)-command 后第一次(或有时是第二次)python 崩溃......!?
    • 崩溃怎么办?标准异常还是因信号 (SEGV) 而死?
    • IDLE 冻结,然后窗口被任务管理器关闭。
    • 旧版本 IDLE 中的线程可能存在问题。我认为它已在较新的版本中得到解决。
    【解决方案3】:

    我现在找到的解决办法是:

    不要使用 Python 2.5.2! 如果使用 Python 2.7.2 代替,上面的代码效果很好。

    谢谢大家!

    【讨论】:

      【解决方案4】:

      使用守护进程=True。这将确保您的线程在执行主函数后退出。

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-03
        • 1970-01-01
        • 2013-02-16
        相关资源
        最近更新 更多