[英]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.