python-3.x - 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文档:
target 是 run() 方法调用的可调用对象。默认为 None,表示不调用任何内容。
所以正确的用法是
threading.Thread(target=insertBlock)
(没有()
after insertBlock
),因为 elseinsertBlock
被调用,正常执行(阻塞主线程)并target
设置为它的 return value None
。这会导致t1.start()
不执行任何操作,并且您不会获得任何性能改进。
警告:
请注意,多线程无法保证不同线程中的执行顺序。你不能依赖函数insertBlock
里面已经插入数据库的数据insertTransactionData
,因为在insertTransactionData
使用这个数据的时候,你不能确定它已经被插入了。因此,多线程可能根本不适用于此代码,或者您需要重组代码并仅并行化那些不相互依赖的部分。
推荐阅读
- dictionary - 立方体贴图/帧缓冲问题
- swift - 如何在 Xcode Playground 的右侧栏中创建我的类型的自定义表示?
- node.js - 无法将角度更新到版本 6
- git - 如何在所有分支中克隆 git 存储库到特定时间?
- android - 上传到Play商店后无法使用linkedIn登录,(直接在发布apk中工作,而不是从Play商店)
- python - 如何在熊猫中进行左外连接排除
- azure - Azure 环境变量
- sql - 将 count() 后的结果分组为 SQL Server 中每个组的单行
- debugging - 是否可以在 PyDev 脚本中设置断点?
- r - 多列数据框