繁体   English   中英

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

[英]Python Multithreading a for loop with limited Threads

我只是在学习Python,对Multithreading的了解也不多。 我正在尝试通过Requests session.post方法发送一些json。 我需要遍历字典的许多for循环底部的函数中调用此函数。

有没有办法让它并行运行?

我还必须限制线程的数量,否则发布调用将被阻塞,因为它们彼此之间会很快。 帮助将不胜感激。

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

首先,我们将只查找一次equipment['itemHash']equipment['characterIndex']

可以使用in运算符来代替显式循环RefHashList 这会将循环移至速度更快的Python虚拟机中。

除了嵌套的if -condition之外,您还可以使用and来使用单个条件。

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

其次,您需要多少额外的性能? SendJsonViaSession调用之间平均要花费多少时间,并且这次可以变成多少时间才能阻止调用? 如果这些数字之间的差很小,则可能不值得实现线程发件人。

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

编辑:

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

问题是,它们都没有速率限制。 因此,您可能因拨打太多电话而被阻止。 每次调用SendJsonViaSession ,都必须以某种方式保存当前时间,以便所有进程或线程都可以使用它。 在每次通话之前,您都必须阅读该时间,然后等待距离最近的通话时间太近。

编辑2:

如果对SendJsonViaSession的调用仅花费0.3秒,则您应该能够连续每秒进行3次调用。 但是您的代码每秒只进行1次调用。 这意味着速度限制在其他地方。 您必须分析您的代码以查看问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM