我的python代码有什么问题?

时间:2015-06-27 15:54:41

标签: python python-2.7

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()

1 个答案:

答案 0 :(得分:0)

您的问题是因为您使用多个线程,但不知道为什么要使用它。

简单地说,这是发生的步骤 -

  1. 您创建了一个线程,该线程使用single_thread(每个元素)和my_tuple_list中的队列值调用函数QUEUE_HTMLNODE

  2. 您正在启动该主题,首先通过其罚款,mytuple[0].qsize()0,因此HTMLNODE队列中没有添加任何内容。

  3. 但同时,在主线程中,您正在检查QUERYNODE是否为0,如果不是,则在my_tuple_list中将元素添加到队列中这是相同的队列你发送了线程。

  4. 现在,从睡眠状态唤醒5秒后,它会检查my_tuple[0]是否仍为空(qsize等于零),但这次它不是空的,因为在主线程中,您在Step 3(上面)的队列中放置了一个条目,由于这些只是线程,它们共享全局命名空间,其中定义了队列和列表(并且python的函数调用通过引用传递。

  5. 所以这次它会将条目放入QUEUE_HTMLNODE,所以下次去检查时QUEUE_HTMLNODEqsize会大于0,导致您观察到的内容

  6. 展示行为的简单示例 -

    >>> 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]