在python请求中使用多线程是否安全?

时间:2019-03-02 10:36:17

标签: python multithreading python-multiprocessing python-multithreading python-pool

我正在使用此代码(在下面),发布在here上,做了很少的更改以使其可在python 3.6.5中运行(将import Queue更改为import queue等) 。

我将下面的代码更改为使用requests.get(host)而不是urlib2,并且我当然添加了import requests。但是逻辑几乎相同。

我的问题是:

  1. 下面的多线程代码可以安全地与requests模块而不是urlib2一起使用吗?

  2. 该行: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)

0 个答案:

没有答案