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

老电线

我只是在学习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']只有一次。

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

if除了使用嵌套条件,您还可以使用单个条件using and

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

其次,您需要多少额外的性能?两次SendJsonViaSession通话之间平均有多少时间,而这次通话可以阻塞多少时间?如果这些数字之间的差很小,则可能不值得实现线程发送器。

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

编辑:

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

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

编辑2:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章