Python多线程处理具有有限线程的for循环
我只是在学习Python,对多线程没有太多经验。我试图通过Requests session.post方法发送一些json。这是在我需要在字典中运行的许多for循环的底部的函数中调用的 有没有办法让它并行运行 我还必须限制我的线程数量,否则post调用会被阻止,因为它们会在彼此之后变快。非常感谢您的帮助Python多线程处理具有有限线程的for循环,python,multithreading,python-requests,Python,Multithreading,Python Requests,我只是在学习Python,对多线程没有太多经验。我试图通过Requests session.post方法发送一些json。这是在我需要在字典中运行的许多for循环的底部的函数中调用的 有没有办法让它并行运行 我还必须限制我的线程数量,否则post调用会被阻止,因为它们会在彼此之后变快。非常感谢您的帮助 def doWork(session, List, RefHashList): for itemRefHash in RefHashList: for equipment
def doWork(session, List, RefHashList):
for itemRefHash in RefHashList:
for equipment in res['Response']['data']['items']:
if equipment['itemHash'] == itemRefHash:
if equipment['characterIndex'] != 0:
SendJsonViaSession(session, getCharacterIdFromIndex(res, equipment['characterIndex']), itemRefHash, equipment['quantity'])
首先,以不同的方式构造代码可能会提高速度,而不会增加线程的复杂性
def doWork(session, res, RefHashList):
for equipment in res['Response']['data']['items']:
i = equipment['itemHash']
k = equipment['characterIndex']
if i in RefHashList and k != 0:
SendJsonViaSession(session, getCharacterIdFromIndex(res, k), i, equipment['quantity'])
首先,我们将只查找一次设备['itemHash']
和设备['characterIndex']
您可以使用in
操作符中的,而不是显式循环使用RefHashList
。这将循环移动到Python虚拟机中,速度更快
您可以使用和使用单个条件,而不是嵌套的if
-conditional
注意:我已删除未使用的参数列表
,并将其替换为res
。编写只作用于给定参数的函数,而不是全局变量,通常是一种良好的做法
第二,你需要多少额外的性能?SendJsonViaSession
调用之间平均有多长时间,在调用被阻止之前,这段时间会变小多少?如果这些数字之间的差异很小,那么可能不值得实现线程发送器
第三,标准Python实现的一个设计特性是一次只能有一个线程执行Python字节码。因此,不能肯定线程是否会提高性能
编辑:
有几种方法可以在Python中并行运行stuff。有使用进程的multiprocessing.Pool
和使用线程的multiprocessing.dummy.ThreadPool
。从Python3.2开始,就有了concurrent.futures
,它可以使用进程或线程
问题是,它们都没有利率限制。所以你可能会因为打太多电话而被阻止。
每次调用SendJsonViaSession
时,都必须以某种方式保存当前时间,以便所有进程或线程都可以使用它。在每次通话之前,你必须阅读时间,如果离最后一次通话太近,你就要等待
Edit2:
如果对SendJsonViaSession
的调用只需要0.3秒,那么您应该能够以每秒3次的顺序进行调用。但您的代码每秒只执行1次调用。这意味着速度限制在其他地方。您必须修改代码才能看到问题所在。太棒了。感谢您提供的快速且信息丰富的帮助。我可以在10秒内拨打250个电话,否则油门会启动,我会被堵住。现在,我在10秒内发送了大约10个电话。所以可能会有改进的潜力。@LeoldeWire调用SendJsonViaSession
实际需要多长时间?~0.3秒say@LeoldeWire通过一个文件运行代码。这样,您可以看到哪些线路实际运行时间最长。那你就知道要优化什么了