Python:多线程上的 CPU 密集型任务

Posted

技术标签:

【中文标题】Python:多线程上的 CPU 密集型任务【英文标题】:Python: CPU intensive tasks on multiple threads 【发布时间】:2020-10-11 04:26:12 【问题描述】:

假设我有这个类:

class Foo:
    def __init__(self):
        self.task1_dict = 
        self.task2_dict = 

    def task1(self):
        for i in range(10000000):
            # update self.task1_dict
    
    def task2(self):
        for i in range(10000000):
            # update self.task2_dict

    def run(self):
        self.task1()
        self.task2()

任务 1 和任务 2 都是 CPU 密集型任务并且是非 IO。它们也是独立的,因此您可以假设同时运行它们是线程安全的。

目前,我的班级正在按顺序运行任务,我想对其进行更改,以便任务在多个线程中并行运行。我正在使用 concurrent.future 包中的 ThreadPoolExecutor。

class Foo:
    ...
    def run(self):
        with ThreadPoolExecutor() as executor:
            executor.submit(self.task1)
            executor.submit(self.task2)

问题是当我调用run 方法时,与顺序版本相比,运行时间根本没有减少,甚至略有增加。我猜这是因为 GIL 一次只允许一个线程运行。有什么方法可以并行化这个程序吗?也许是一种克服 GIL 并在 2 个线程上运行 2 个方法的方法?我考虑过切换到ProcessPoolExecutor、but I cannot call the methods since class methods are not picklable。此外,如果我使用多处理,Python 将创建多个Fooself.task1_dict 实例,self.task2_dict 不会相应更新。

【问题讨论】:

【参考方案1】:

您可以按照here的说明使用多处理共享内存

【讨论】:

以上是关于Python:多线程上的 CPU 密集型任务的主要内容,如果未能解决你的问题,请参考以下文章

python 测试CPU密集型任务的单进程,多线程和多进程性能

3.2.8 多线程使用场景

Python简单多进程demo

具有线程或多处理的 Tkinter CPU 密集型任务

day9-Python学习笔记(二十二)多线程,多进程

多进程和多线程