我只是在学习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'])
首先,以不同的方式组织代码可以在不增加线程复杂性的情况下提高速度。在
首先,我们将只查找}一次。在
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您的代码才能查看问题所在。在相关问题 更多 >
编程相关推荐