首页 > 解决方案 > Python 3 中的线程

问题描述

我编写Python 3代码,其中有 2 个函数。第一个函数 insertBlock() 在MongoDB集合 1 中插入数据,第二个函数 insertTransactionData() 从集合 1 中获取数据并将其插入到集合 2 中。数据量非常大,所以我使用线程来提高性能。但是当我使用线程时,插入数据比不使用线程需要更多时间。我很困惑,线程将如何在我的代码中工作以及如何提高性能?这是主要功能:

if __name__ == '__main__':  
   t1 = threading.Thread(target=insertBlock())  
   t1.start()  
   t2 = threading.Thread(target=insertTransactionData())  
   t2.start()

标签: python-3.xmongodbpython-multithreading

解决方案


来自线程的python文档:

target 是 run() 方法调用的可调用对象。默认为 None,表示不调用任何内容。

所以正确的用法是

threading.Thread(target=insertBlock)

(没有()after insertBlock),因为 elseinsertBlock被调用,正常执行(阻塞主线程)并target设置为它的 return value None。这会导致t1.start()不执行任何操作,并且您不会获得任何性能改进。

警告: 请注意,多线程无法保证不同线程中的执行顺序。你不能依赖函数insertBlock里面已经插入数据库的数据insertTransactionData,因为在insertTransactionData使用这个数据的时候,你不能确定它已经被插入了。因此,多线程可能根本不适用于此代码,或者您需要重组代码并仅并行化那些不相互依赖的部分。


推荐阅读