队列和线程的并发请求

问题描述 投票:0回答:1

我正在尝试使用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

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

python python-3.x concurrency request
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.