我正在尝试使用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
我希望这足以让你帮助我。 否则,我将重写代码以创建可由任何人运行的代码。
答案 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