我正在使用请求和python中的线程来做一些事情。我的问题是:此代码是否真正在多线程上运行并且使用安全吗?随着时间的流逝,我的速度有所下降。注意:我没有使用确切的代码,但是我正在做类似的事情。
import time
import requests
current_threads = 0
max_threads = 32
def doStuff():
global current_threads
r = requests.get('https://google.de')
current_threads-=1
while True:
while current_threads >= max_threads:
time.sleep(0.05)
thread = threading.Thread(target = doStuff)
thread.start()
current_threads+=1
答案 0 :(得分:0)
您遇到的问题可能有多种原因。我不是Python方面的专家,但是我可以看到许多导致速度变慢的原因。我能想到的潜在原因如下:
根据要提取的数据大小,您可能会超载带宽。很难证明您所使用的确切代码,您的代码在做什么以及不知道您的带宽。
Kinda连接到第一个,但是如果您的文件花费一些时间来关闭每个线程,它可能会在以下位置被阻塞:
while current_threads >= max_threads:
time.sleep(0.05)
您可以尝试减少最大线程数,看看是否有帮助,尽管下载文件需要花费时间,但可能没有帮助。
问题可能不在于您的代码或带宽,而是与您要从中提取文件的服务器有关,如果该服务器超载,则可能会减慢传输速度。
服务器上的防火墙,IPS,IDS,策略可能会限制您的请求。如果您提出太多要求从同一IP快速进行全部访问的请求,则服务器端网络设备可能会将其误认为是某种DoS攻击,从而限制了您的请求作为响应。
不幸的是,与C#或C ++等其他低级语言相比,Python在多线程方面不那么出色。这是由于在多个线程中访问/操纵相同数据时会起作用的,称为GIL(全局解释器锁)。这本身就是一个相当大的主题,但是如果您想阅读它,请查看此链接。
https://medium.com/practo-engineering/threading-vs-multiprocessing-in-python-7b57f224eadb
很抱歉,我无法再提供任何帮助,但是鉴于所提供的信息,这就我可以说的那么多。
答案 1 :(得分:0)
当然,您正在运行多个线程,并且前提是它们不访问/更改您可能“安全”的相同资源。
每当我访问外部资源(即,使用请求)时,我总是建议使用优于异步线程的asyncio,因为它允许自定义上下文切换(在有“ await”的任何地方都可以切换上下文,而在普通线程之间切换线程)由操作系统决定,可能不是最佳选择),并减少了开销(您仅使用一个线程)。