python - Python中的多线程并行运行
问题描述
我对 Python 中的多线程有疑问。
我已经在 python 中尝试过多线程和多处理。
我得到的是多线程,并行运行时会得到重复的结果。经过研究,我发现在multiThread中,Multithread可以更新同一个变量(race Condition)。
同时,在多处理中,它会顺利进行,不会像在多线程中那样出现问题。
问题是,我可以使用多线程,但机制就像多处理吗?因为我需要迁移超过 200 万条记录,并且我需要尽可能异步地运行该功能(我的笔记本电脑只有 4 个核心),所以我需要使用多线程。
有人可以向我解释一下上面的问题吗?
解决方案
在多线程中,每个线程将与产生它们的父进程共享相同的内存空间。但是在多线程中,每个进程都有自己的内存空间。
但是,在多线程中,您需要使用锁(信号量/互斥锁),(例如threading.Lock()
防止竞争条件。并不是说多处理不会有竞争条件,如果您专门共享同一个对象并且可以拥有它不是它的副本。但默认情况下它将复制对象。
多线程也受到 python 的 GIL(全局解释器锁)的限制,它确保只有一个线程同时运行。因此,如果您有在两个线程上运行的密集计算任务,它并不能真正让它更快,因为只有一个可以同时处于活动状态。
但是,多处理可以轻松克服它,因为它在多个进程上运行,并且每个进程将由操作系统的调度程序处理并并行运行。
一般经验法则:如果您的进程是计算密集型的,则使用进程 如果您的进程是 I/O 密集型的,则使用线程
如果你的线程需要并发访问同一个变量/对象等,你需要使用锁。
推荐阅读
- r - 如何在 ggplot2 中绘制模型的 mle2 拟合以及数据?
- docker - 如何在 Dockerfile 中设置 JVM 设置
- autodesk-forge - 为什么您计划将默认的 IFC 模型衍生处理器从 Navisworks 导入器更改为 Revit 导入器?
- python - Pandas:按子组的出现次数过滤行
- php - 使用 Simplexml 的 Xpath 根据 PHP 中的值过滤节点
- hashmap - 将 struts 1 嵌套标签迁移到 struts 2
- javascript - 在 clearTimeout 之后它仍然是一个数字
- r - 关于网络抓取 youtube 视频的错误:“当前工作目录中不存在 NA”
- r - 拟合多项式
- bash - 如何将临时数组环境变量参数传递给 bash 函数?