我只是在学习Python,并且在多线程方面没有太多的表现。我试图通过Requests session.post方法发送一些json。这是在我需要通过字典运行的许多for循环的bottem函数中调用的。
有没有办法让它在并列中运行?
我还必须限制我的线程数量,否则后置调用会被阻止,因为它们会在彼此之后加速。非常感谢帮助。
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'])
答案 0 :(得分:3)
首先,以不同方式构建代码可能会提高速度,而不会增加线程的复杂性。
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
- 条件,您可以使用and
使用单个条件。
注意:我删除了未使用的参数List
,并将其替换为res
。通常,优良作法是编写仅对给定参数的函数,而不是全局变量。
其次,您需要多少额外性能? SendJsonViaSession
次呼叫平均有多少时间,这次呼叫被阻止之前这个时间有多小?如果这些数字之间的差异很小,则可能不值得实现线程发送者。
第三,标准Python实现的设计特性是,一次只有一个线程可以执行Python字节码。因此,不确定线程是否会提高性能。
修改强>
有几种方法可以在Python中并行运行东西。有multiprocessing.Pool
使用进程,multiprocessing.dummy.ThreadPool
使用线程。从Python 3.2开始,有concurrent.futures
,它可以使用进程或线程。
SendJsonViaSession
时,您都必须以某种方式保存当前时间,以便所有进程或线程都可以使用它。在每次通话之前,您必须阅读该时间并等待它与上一次通话太接近。
<强> EDIT2:强>
如果对SendJsonViaSession
的呼叫只需0.3秒,您应该可以顺序执行3次/秒的呼叫。但是你的代码只做1次/秒。这意味着速度限制在其他地方。您必须profile您的代码才能查看问题所在。