Python多线程一个有限线程的for循环

时间:2017-01-27 20:14:01

标签: python multithreading python-requests

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

有没有办法让它在并列中运行?

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

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'])

1 个答案:

答案 0 :(得分:3)

首先,以不同方式构建代码可能会提高速度,而不会增加线程的复杂性。

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'])

首先,我们只会查询equipment['itemHash']equipment['characterIndex']一次。

您可以使用RefHashList运算符,而不是显式循环in。这会将循环移动到Python虚拟机中,这会更快。

而不是嵌套的if - 条件,您可以使用and使用单个条件。

注意:我删除了未使用的参数List,并将其替换为res。通常,优良作法是编写仅对给定参数的函数,而不是全局变量。

其次,您需要多少额外性能? SendJsonViaSession次呼叫平均有多少时间,这次呼叫被阻止之前这个时间有多小?如果这些数字之间的差异很小,则可能不值得实现线程发送者。

第三,标准Python实现的设计特性是,一次只有一个线程可以执行Python字节码。因此,不确定线程​​是否会提高性能。

修改

有几种方法可以在Python中并行运行东西。有multiprocessing.Pool使用进程,multiprocessing.dummy.ThreadPool使用线程。从Python 3.2开始,有concurrent.futures,它可以使用进程或线程。

事实是,他们都没有速率限制。所以你可能因为拨打太多电话而受阻。 每次调用SendJsonViaSession时,您都必须以某种方式保存当前时间,以便所有进程或线程都可以使用它。在每次通话之前,您必须阅读该时间并等待它与上一次通话太接近。

<强> EDIT2:

如果对SendJsonViaSession的呼叫只需0.3秒,您应该可以顺序执行3次/秒的呼叫。但是你的代码只做1次/秒。这意味着速度限制在其他地方。您必须profile您的代码才能查看问题所在。