python我的python代码有什么问题?

2024-06-16 10:16:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: innodeforifqueuemylistflag
1条回答
网友
1楼 · 发布于 2024-06-16 10:16:28

你的问题是因为你正在使用多个线程,尽管你不知道为什么要使用它。你知道吗

简单地说,以下是正在发生的步骤-

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

  2. 然后启动线程,因为第一次传递它的fine,mytuple[0].qsize()0,所以没有任何内容添加到HTMLNODE队列。

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

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

  5. 所以这次它把条目放入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]

相关问题 更多 >