Python多线程处理具有有限线程的for循环

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

我只是在学习Python,对多线程没有太多经验。我试图通过Requests session.post方法发送一些json。这是在我需要在字典中运行的许多for循环的底部的函数中调用的

有没有办法让它并行运行

我还必须限制我的线程数量,否则post调用会被阻止,因为它们会在彼此之后变快。非常感谢您的帮助

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通过一个文件运行代码。这样,您可以看到哪些线路实际运行时间最长。那你就知道要优化什么了