队列和线程的并发请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列和线程的并发请求相关的知识,希望对你有一定的参考价值。

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

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

答案

我猜这些航班没有被列入队列。 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

以上是关于队列和线程的并发请求的主要内容,如果未能解决你的问题,请参考以下文章

基于线程池消息队列和epoll模型实现Client-Server并发架构

#yyds干货盘点#JS是单线程的,那么JS是如何实现并发请求的?

IIS连接数IIS并发连接数IIS最大并发工作线程数应用程序池的队列长度应用程序池的

你真的了解:IIS连接数IIS并发连接数IIS最大并发工作线程数应用程序池的队列长度应用程序池的...

IIS 之 连接数并发连接数最大并发工作线程数队列长度最大工作进程数

ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求