1.我不知道为什么“如果”排队_HTMLNODE.qsize()>;0“可能是真的,因为我认为“if mytuple[0].qsize()>;0”永远不会是真的,所以队列_HTMLNODE.qsize()永远不会大于零,但是代码结果有时会打印“跳转我的元组列表”,所以我很困惑。你知道吗
2.谢谢大家的帮助我。那个完整代码如下:
#encoding=utf-8
import threading,time
import Queue
import pdb
QUEUE_HTMLNODE=Queue.Queue()
QUEUE_URLNODE=Queue.Queue()
TOTAL_COUNT=0
stop_flag=0
EXIT_FLAG=0
my_tuple_list=[]
QUEUE_URLNODE.put('way')
def single_thread(mytuple,QUEUE_HTMLNODE):
global TOTAL_COUNT
global stop_flag
global EXIT_FLAG
while stop_flag<15:
if mytuple[0].qsize()>0:
html_node="lll"
QUEUE_HTMLNODE.put(html_node)
TOTAL_COUNT+=1
else:
stop_flag+=1
time.sleep(5)
EXIT_FLAG += 1
for i in xrange(10):
my_tuple_list.append((Queue.Queue(),str(i)))
threads_list=[]
for i in xrange(10):
threads_list.append(threading.Thread(target=single_thread,args=(my_tuple_list[i],QUEUE_HTMLNODE)))
for i in threads_list:
i.setDaemon(True)
i.start()
while (True):
for i in my_tuple_list:
if QUEUE_URLNODE.qsize()>0:
node = QUEUE_URLNODE.get()
i[0].put(node)
print "in the my_tuple_list 中 "
if QUEUE_HTMLNODE.qsize()>0:
print "jump my_tuple_list"
print QUEUE_HTMLNODE.qsize()
你的问题是因为你正在使用多个线程,尽管你不知道为什么要使用它。你知道吗
简单地说,以下是正在发生的步骤-
您已经创建了一个线程,该线程使用
my_tuple_list
(每个元素)和QUEUE_HTMLNODE
中的队列值调用函数single_thread
。然后启动线程,因为第一次传递它的fine,
mytuple[0].qsize()
是0
,所以没有任何内容添加到HTMLNODE
队列。但同时,在主线程中,检查
QUERYNODE
是否为0,如果不是,则在my_tuple_list
中将元素添加到队列中,这与发送到线程中的队列相同。现在,在从睡眠中醒来5秒钟后,它检查
my_tuple[0]
是否仍然是空的(qsize
等于零),但这次它不是空的,因为在主线程中,您在Step 3
(上图)的队列中放置了一个条目,并且由于这些只是线程,它们共享全局名称空间,在这里定义了队列和列表(以及python的函数调用是通过引用传递的。所以这次它把条目放入
QUEUE_HTMLNODE
,所以下次你去检查QUEUE_HTMLNODE
,它的qsize
会大于0,导致你观察到的结果。一个简单的例子来展示你的行为-
相关问题 更多 >
编程相关推荐