Python论坛  - 讨论区

标题:queue问题

2010年06月17日 星期四 14:10

#-*-coding:utf-8-*-
from get_next_page import  (make_url1,get_page_link,get_kind)
import Queue
import threading
import urllib2
import time
import os
queue = Queue.Queue()
class ThreadUrl(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
         
    def run(self):
        while True:
            print"-------------------------------run----------------------------------"
            host = self.queue.get()
            print self.getName() ,"\n"
            print host
            print "-------------------------------end--------------------------------"       
            get_page_link(host)
            self.queue.task_done()
           
start = time.time()
def main():
    url = ["http://www.txooo.com/cp/index.htm","http://www.txooo.com/"]
    hosts = []
    for surl in url :
        hosts = hosts+get_kind(surl) 
    print hosts
    th_NO = len(hosts)
    queue = Queue.Queue()
    for i in range(th_NO):
        t = ThreadUrl(queue)
        t.setDaemon(True)
        t.start()

    for host in hosts:
        print "---------------------------queue1-----------------------------------------"
        print host[1]
        print host[0]
        print "---------------------------queue2------------------------------------------"
        queue.put(host[1])
    queue.join()
    return "done"




###########################################################################################
#############################$$$$$$$$$$$$$################################################


queue1 = Queue.Queue()
class Threadco(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, queue1):
        threading.Thread.__init__(self)
        self.queue1 = queue1
         
    def run(self):
        while True:
            host = self.queue1.get()
            print self.getName()
            make_url1(host)
            self.getName()
            self.queue1.task_done()

def main_con():
    f= os.popen(" awk '!a[$0]++' tx_detail.txt ").readlines()
    link_list = f
    length = len(link_list)
    for i in range(200):                  # 应为length值太大所以只取200                  
        s  = Threadco(queue1)
        s.setDaemon(True)
        s.start()
   
#populate queue with data  
    for link in link_list:
        print link.strip()
        queue1.put(link)
    queue1.join()
flag =  main()
if flag == "done" :  
    main_con()
现在的问题是main()执行完了,就不枉下执行了,而且也不退出,怎么让队列执行完之后,退出,接着执行main_con(), 看看代码 给点意见。

2010年06月17日 星期四 14:19

你要检查是停在哪里后不动了。估计和queue.join()有关,看文档中说使用q.join()需要与q.task_done()相匹配,好象你在q.get()之后没有调用q.task_done()所以,q认为没有处理完毕,所以还等着不动。

2010年06月17日 星期四 14:52

   def run(self):
        while True:
            host = self.queue1.get()
            print self.getName()
            make_url1(host)
            self.getName()
            self.queue1.task_done()

queue1.task_done() 在 run里边了,

难道是以下这三个东东的原因

           print self.getName()
            make_url1(host)
            self.getName()

好象不是呀

2010年06月17日 星期四 14:59

多加些print看吧。看程序好象没什么问题了。

2010年06月17日 星期四 15:11

好的 ,对了问一下python2.6.5 的stackless和系统不兼容,只要是装了stackless 其他的第三方egg 会出现importError ,即使指定路径安装,也会出现相应的问题,用sys.append()的方法照样出错。系统是Ubuntu10.04 。stackless的channel,和stackless.run 要比queue跑的快的多。

如果有着方面的经验 希望指点一二。

2010年06月17日 星期四 15:17

没用过stackless,看其它人有没有了解的。

2010年06月17日 星期四 21:42

多线程的 为嘛还要“ while True:“ ?

2010年06月17日 星期四 22:37

就是要死循啊

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号