Python中的多线程并行运行
Posted
技术标签:
【中文标题】Python中的多线程并行运行【英文标题】:Multi Thread in Python run in parallel 【发布时间】:2020-11-10 09:06:25 【问题描述】:我有一个关于 Python 中的多线程的问题。
我已经在 python 中尝试过多线程和多处理。
我得到的是 在多线程中,并行运行时会得到重复的结果。经过研究,我发现在multiThread中,Multithread可以更新同一个变量(race Condition)。
同时,在多处理中,它会顺利进行,不会像在多线程中那样出现问题。
问题, 我可以使用多线程,但机制就像多处理?因为我需要迁移超过 200 万条记录,并且我需要尽可能异步地运行该功能(我的笔记本电脑只有 4 个核心),所以我需要使用多线程。
有人可以向我解释一下上面的问题吗?
【问题讨论】:
【参考方案1】:在多线程中,每个 线程 将与生成它们的父进程共享相同的内存空间。但是在多线程中,每个进程都有自己的内存空间。
但是,在多线程中,您需要使用锁(信号量/互斥锁),(例如threading.Lock()
来防止竞争条件。并不是说多处理不会有竞争条件,如果您可以拥有它专门共享同一个对象而不是它的副本。但默认情况下它会复制该对象。
多线程也受到 python 的 GIL(全局解释器锁)的限制,它确保只有一个线程同时运行。因此,如果您在两个线程上运行密集的计算任务,它并不能真正提高速度,因为只有一个线程可以同时处于活动状态。
但是,多处理可以轻松克服它,因为它在多个进程上运行,每个进程将由操作系统的调度程序处理并并行运行。
一般经验法则: 如果您的流程是计算密集型的,请使用流程 如果您的进程是 I/O 密集型的,请使用线程
如果你的线程需要并发访问同一个变量/对象等,你需要使用锁。
【讨论】:
以上是关于Python中的多线程并行运行的主要内容,如果未能解决你的问题,请参考以下文章