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 © 2024
京ICP备05028076号