Python多线程有限线程for循环

2024-05-19 10:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在学习Python,对多线程处理没有太多的经验。我试图通过请求发送一些json会话.post方法。这是在函数的底部调用的,我需要在字典中运行许多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'])

Tags: 方法函数injsonforif字典session
1条回答
网友
1楼 · 发布于 2024-05-19 10:28:16

首先,以不同的方式组织代码可以在不增加线程复杂性的情况下提高速度。在

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']和{}一次。在

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

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

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

第二,你需要多少额外的表现?在SendJsonViaSession调用之间平均有多长时间,在调用被阻塞之前,这段时间能变得多小?如果这些数字之间的差异很小,则可能不值得实现线程化发送器。在

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

编辑:

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

问题是,它们都没有速率限制。所以你可能会因为打太多电话而被阻止。 每次调用SendJsonViaSession时,都必须以某种方式保存当前时间,以便所有进程或线程都可以使用它。每次打电话之前,你都要读一下时间,如果时间离最后一次通话太近,就得等着。在

编辑2:

如果对SendJsonViaSession的调用只需0.3秒,则应该能够按顺序每秒执行3次调用。但是你的代码每秒只执行1次调用。这意味着限速是在别的地方。您必须profile您的代码才能查看问题所在。在

相关问题 更多 >

    热门问题