我正在使用此代码(在下面),发布在here上,做了很少的更改以使其可在python 3.6.5中运行(将import Queue
更改为import queue
等) 。
我将下面的代码更改为使用requests.get(host)
而不是urlib2
,并且我当然添加了import requests
。但是逻辑几乎相同。
我的问题是:
下面的多线程代码可以安全地与requests
模块而不是urlib2
一起使用吗?
该行:self.queue = q
是否正确?因为在原始帖子中,该行是:
self.queue =队列
并且操作码具有queue = Queue.Queue()
但是我将其更改为:
self.queue = q
我有q = queue.Queue()
我不确定我是否做对了。鉴于Queue
模块在3.6.5中已被命名为queue
的事实,旧代码中的命名约定令人困惑。因此,我将其变量queue
更改为q
。但是我不确定我是否正确地更新了代码。您能检查一下并确认吗?
import queue
import threading
import urllib2
import time
hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com",
"http://ibm.com", "http://apple.com"]
q = queue.Queue()
class ThreadUrl(threading.Thread):
"""Threaded Url Grab"""
def __init__(self, q):
threading.Thread.__init__(self)
self.queue = q
def run(self):
while True:
#grabs host from queue
host = self.queue.get()
#grabs urls of hosts and prints first 1024 bytes of page
url = urllib2.urlopen(host)
print url.read(1024)
#signals to queue job is done
self.queue.task_done()
start = time.time()
def main():
#spawn a pool of threads, and pass them queue instance
for i in range(5):
t = ThreadUrl(q)
t.setDaemon(True)
t.start()
#populate queue with data
for host in hosts:
q.put(host)
#wait on the queue until everything has been processed
q.join()
main()
print "Elapsed Time: %s" % (time.time() - start)