1.我不知道为什么“如果QUEUE_HTMLNODE.qsize()> 0”可以为真,因为我认为“if mytuple [0] .qsize()> 0”永远不会是真的所以QUEUE_HTMLNODE。 qsize()永远不会超过零,但代码结果有时会打印“jump my_tuple_list”。所以我很困惑。
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()
答案 0 :(得分:0)
您的问题是因为您使用多个线程,但不知道为什么要使用它。
简单地说,这是发生的步骤 -
您创建了一个线程,该线程使用single_thread
(每个元素)和my_tuple_list
中的队列值调用函数QUEUE_HTMLNODE
。
您正在启动该主题,首先通过其罚款,mytuple[0].qsize()
为0
,因此HTMLNODE
队列中没有添加任何内容。
但同时,在主线程中,您正在检查QUERYNODE
是否为0,如果不是,则在my_tuple_list
中将元素添加到队列中这是相同的队列你发送了线程。
现在,从睡眠状态唤醒5秒后,它会检查my_tuple[0]
是否仍为空(qsize
等于零),但这次它不是空的,因为在主线程中,您在Step 3
(上面)的队列中放置了一个条目,由于这些只是线程,它们共享全局命名空间,其中定义了队列和列表(并且python的函数调用通过引用传递。
所以这次它会将条目放入QUEUE_HTMLNODE
,所以下次去检查时QUEUE_HTMLNODE
其qsize
会大于0,导致您观察到的内容
展示行为的简单示例 -
>>> import threading
>>> import time
>>> def func(l):
... i = 0
... while i < 15:
... l.append(i)
... i += 1
... time.sleep(1)
>>> def foo(t):
... t.start()
... i = 20
... while i > 0:
... print(l)
... i -= 1
... time.sleep(0.5)
>>> l = []
>>> t = threading.Thread(target=func, args = (l,))
>>> foo(t)
[0]
[0]
[0]
[0, 1]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]