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