gpt4 book ai didi

python - 如何在Python中让线程等待?

转载 作者:行者123 更新时间:2023-12-01 09:06:14 24 4
gpt4 key购买 nike

我有以下代码:

        with ThreadPoolExecutor(max_workers=num_of_pages) as executor:
futh = [(executor.submit(self.getdata2, page, hed, data, apifolder,additional)) for page in pages]
for data in as_completed(futh):
datarALL = datarALL + data.result()
return datarALL

num_of_pages 不是固定的,但通常在 250 左右。getdata2 func 创建 GET 请求并返回每个页面结果:

问题是所有 250 个页面(线程)都是一起创建的。这意味着同时调用 250 个 GET 请求。这会导致服务器过载,因此由于服务器响应延迟而关闭 GET 调用并重试,我会进行大量重试。我想避免它。

我考虑创建某种锁,如果有超过 10 个事件请求,它将阻止线程/页面创建 GET 请求。在这种情况下,它将等待直到有可用的插槽。

像这样的事情:

executing_now = []
def getdata2(...)
...
while len(executing_now)>10:
sleep(10)
executing_now.append(page)
response = requests.get(url, data=data, headers=hed, verify=False)
....
executing_now.remove(page)
return ...

Python 中是否存在这样的机制?这需要线程检查共享内存......我想避免多线程问题,例如死锁等......

基本上,通过限制可以同时执行的线程数来扭曲 GET 调用。

最佳答案

我们可以使用队列来“准备”您的所有页面,然后您可以将线程池​​限制为任意数量的线程,因为每个线程都会从队列中获取所需的页面:

# preparing here all you page objects
pages_queue = queue.Queue()
[pages_queue.put(page) for page in pages]

# ThreadPool - Each thread will take one page from queue, and when done, will fetch next one
with ThreadPoolExecutor(max_workers=10) as executor:
futh = [(executor.submit(self.getdata2, pages_queue, hed, data, apifolder,additional))]
for data in as_completed(futh):
datarALL = datarALL + data.result()
return datarALL

def getdata2(...)
...
try:
while True: # non blocking wait will raise Empty when queue is empty
page = pages_queue.get_nowait()
response = requests.get(page.url, data=data, headers=hed, verify=False)
....
return ...
except queue.Empty:
pass

关于python - 如何在Python中让线程等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52024698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com