队列和线程的并发请求

时间:2018-02-28 20:53:23

标签: python python-3.x concurrency request

我正在尝试使用python进行并发API调用。 我的代码基于此主题中提供的解决方案(第一个答案):What is the fastest way to send 100,000 HTTP requests in Python?

目前,我的代码已损坏。 我有一个main函数,它创建队列,填充它,启动线程,启动它们,并加入队列。 我还有一个目标函数,它应该向API发出get请求。

我现在遇到的困难是 目标函数不执行必要的工作。 调用目标,但它的作用是队列为空。 执行第一次打印(“内部刮刀工人”),而第二次打印(“内部刮刀工人 - 队列非空”)不执行。

def main_scraper(flights):
  print("main scraper was called, got: ")
  print(flights)
  data = []
  q = Queue()
  map(q.put, flights)
  for i in range(0,  5):
      t = Thread(target = scraper_worker, args = (q, data))
      t.daemon = True
      t.start()
  q.join()
  return data

def scraper_worker(q, data):
  print("inside scraper worker")
  while not q.empty():
    print("inside scraper worker, queue not empty")
    f = q.get()
    url = kiwi_url(f)
    response = requests.get(url)
    response_data = response.json()
    results = parseResults(response_data)
    q.task_done()
    print("task done. results:")
    print(results)
    #f._price = results[0]["price"]
    #f._url = results[0]["deep_link"]
    data.append(results)
  return data

我希望这足以让你帮助我。 否则,我将重写代码以创建可由任何人运行的代码。

1 个答案:

答案 0 :(得分:1)

我猜这些航班没有被列入队列。 map(q.put, flights)是懒惰的,永远不会被访问,因此就好像它没有发生一样。我会迭代。

def main_scraper(flights):
  print("main scraper was called, got: ")
  print(flights)
  data = []
  q = Queue()
  for flight in flights:
      q.put(flight)
  for i in range(0,  5):
      t = Thread(target = scraper_worker, args = (q, data))
      t.daemon = True
      t.start()
  q.join()
  return data