python线程连接未正确发生

python线程连接未正确发生,python,multithreading,Python,Multithreading,我试图理解python中的线程,但我被困在多线程队列示例中。 我想做的是:- 使用单个队列对象创建2个线程 现在,我将两个不同的数据项放入队列(使用broadcast\u event函数) 现在,在stop方法中,有一个注释行,我将线程连接回主程序 但是,当我取消注释self.join行时,程序将挂起并永远运行。但是,如果我删除了self.join,它就可以正常工作 我想了解我如何使用join是否存在问题 问题在于两个线程使用相同的队列。死锁场景是: 主线程在t1.stop()中发送'shutd

我试图理解python中的线程,但我被困在多线程队列示例中。 我想做的是:-

  • 使用单个队列对象创建2个线程
  • 现在,我将两个不同的数据项放入队列(使用
    broadcast\u event
    函数)
  • 现在,在stop方法中,有一个注释行,我将线程连接回主程序 但是,当我取消注释
    self.join
    行时,程序将挂起并永远运行。但是,如果我删除了
    self.join
    ,它就可以正常工作


    我想了解我如何使用join是否存在问题

    问题在于两个线程使用相同的队列。死锁场景是:

  • 主线程在
    t1.stop()中发送
    'shutdown'
  • t2
    q
  • 主线程加入
    t1
    ,它永远在等待新消息

  • 您可以通过创建两个队列或先执行两条关闭消息,然后执行两条连接来解决此问题。

    您的问题是两个线程使用相同的队列。死锁场景是:

  • 主线程在
    t1.stop()中发送
    'shutdown'
  • t2
    q
  • 主线程加入
    t1
    ,它永远在等待新消息

  • 您可以通过创建两个队列或先执行两条关闭消息,然后执行两条连接来解决此问题。

    问题在于,您有两个线程使用一个队列。当您
    将消息放入队列中时,您无法判断哪个线程将使用它。当您调用
    stop()
    ,向队列中添加
    “shutdown”
    时,它可能会被任何线程使用,而不一定是您想要的线程

    结果可能是另一个线程退出,而您加入了错误的线程

    一种可能的解决方案是首先将
    shutdown
    放入队列N次(N=线程数),然后将它们全部加入

    import threading
    import Queue
    
    q = Queue.Queue()
    class Worker( threading.Thread ):
        def __init__( self, q ):
            threading.Thread.__init__( self )
            self.q = q
    
        def run( self ):
            while True:
                print '%s waiting for data' % self.getName()
                data = self.q.get()
                print '%s data fetched from queue %s' % ( self.getName(), data )
                if data == 'shutdown':
                    print '%s shutting down in %s' % ( self.getName(), self )
                    return
                print '%s received a message: %s' % ( self.getName(), data )
    
        def stop( self ):
            self.q.put( "shutdown" )
    
    #        self.join()  # If I uncomment this line, then sometimes the program does not complete.
    
    
    def broadcast_event( data ):
        q.put( data )
    
    t1 = Worker( q )
    t2 = Worker( q )
    t1.start()
    t2.start()
    broadcast_event( "first event" )
    broadcast_event( "second event" )
    
    t1.stop()
    t2.stop()
    

    更好、更健壮的解决方案是避免通过队列传递关闭消息。您可以使用一个
    self。为此,您应该停止
    属性,在
    run
    中定期检查该属性。问题是您有两个线程使用一个队列。当您
    将消息放入队列中时,您无法判断哪个线程将使用它。当您调用
    stop()
    ,向队列中添加
    “shutdown”
    时,它可能会被任何线程使用,而不一定是您想要的线程

    结果可能是另一个线程退出,而您加入了错误的线程

    一种可能的解决方案是首先将
    shutdown
    放入队列N次(N=线程数),然后将它们全部加入

    import threading
    import Queue
    
    q = Queue.Queue()
    class Worker( threading.Thread ):
        def __init__( self, q ):
            threading.Thread.__init__( self )
            self.q = q
    
        def run( self ):
            while True:
                print '%s waiting for data' % self.getName()
                data = self.q.get()
                print '%s data fetched from queue %s' % ( self.getName(), data )
                if data == 'shutdown':
                    print '%s shutting down in %s' % ( self.getName(), self )
                    return
                print '%s received a message: %s' % ( self.getName(), data )
    
        def stop( self ):
            self.q.put( "shutdown" )
    
    #        self.join()  # If I uncomment this line, then sometimes the program does not complete.
    
    
    def broadcast_event( data ):
        q.put( data )
    
    t1 = Worker( q )
    t2 = Worker( q )
    t1.start()
    t2.start()
    broadcast_event( "first event" )
    broadcast_event( "second event" )
    
    t1.stop()
    t2.stop()
    

    更好、更健壮的解决方案是避免通过队列传递关闭消息。你可以使用一个
    self.u应该停止
    属性,在
    run

    中定期检查这个属性,但是,如果我在做self.join,我怎么会加入错误的呢?问题不在于调用
    join
    ,而在于将
    shutdown
    放入队列中。关机请求可能到达错误的线程(不是
    self
    ),但是,如果我正在执行self.join,我如何才能加入错误的线程?问题不在于调用
    join
    ,而在于将
    shutdown
    放入队列中。关机请求可能到达错误的线程(不是
    self
    ),那么t2.stop是否被调用?@GodMan,它没有。主线程永远不会从
    t1.join()
    返回,因为它永远不会结束。那么,t2.stop是否会被调用?@GodMan,它不会。主线程永远不会从
    t1.join()
    返回,因为它永远不会结束。