2024-04-24 16:50:07 发布
网友
我试图理解multiprocessing比threading的优势。我知道多处理可以绕过全局解释器锁,但是还有什么其他的优点,可以不做相同的事情?
以下是我提出的一些利弊。
multiprocessing
threading.Thread
Queue
threading模块使用线程,multiprocessing模块使用进程。不同之处在于线程在相同的内存空间中运行,而进程有单独的内存。这使得在具有多处理的进程之间共享对象有点困难。由于线程使用相同的内存,因此必须采取预防措施,否则两个线程将同时写入同一内存。这就是全局解释器锁的作用。
threading
生成进程比生成线程慢一点。一旦它们开始运行,就没有什么区别了。
线程的工作是使应用程序能够响应。假设您有一个数据库连接,并且需要响应用户输入。如果没有线程,如果数据库连接正忙,应用程序将无法响应用户。通过将数据库连接拆分为单独的线程,可以使应用程序更具响应性。另外,由于两个线程处于相同的进程中,它们可以访问相同的数据结构—良好的性能,外加灵活的软件设计。
注意,由于GIL的存在,应用程序实际上并没有同时做两件事,但是我们所做的是将数据库上的资源锁放在一个单独的线程中,以便在它和用户交互之间切换CPU时间。CPU时间在线程之间分配。
多处理是指当你真的想在任何给定的时间做不止一件事情的时候。假设您的应用程序需要连接到6个数据库,并对每个数据集执行复杂的矩阵转换。将每个作业放在一个单独的线程中可能会有一些帮助,因为当一个连接空闲时,另一个连接可以获得一些CPU时间,但处理不会并行完成,因为GIL意味着您只使用了一个CPU的资源。通过将每个作业放在一个多处理进程中,每个作业都可以在自己的CPU上运行,并以最高效率运行。
以下是我提出的一些利弊。
多处理
专业人士
multiprocessing
模块包含有用的抽象,其接口非常类似于threading.Thread
缺点
穿线
专业人士
缺点
Queue
模块),则需要手动使用同步原语(锁定的粒度需要决定)threading
模块使用线程,multiprocessing
模块使用进程。不同之处在于线程在相同的内存空间中运行,而进程有单独的内存。这使得在具有多处理的进程之间共享对象有点困难。由于线程使用相同的内存,因此必须采取预防措施,否则两个线程将同时写入同一内存。这就是全局解释器锁的作用。生成进程比生成线程慢一点。一旦它们开始运行,就没有什么区别了。
线程的工作是使应用程序能够响应。假设您有一个数据库连接,并且需要响应用户输入。如果没有线程,如果数据库连接正忙,应用程序将无法响应用户。通过将数据库连接拆分为单独的线程,可以使应用程序更具响应性。另外,由于两个线程处于相同的进程中,它们可以访问相同的数据结构—良好的性能,外加灵活的软件设计。
注意,由于GIL的存在,应用程序实际上并没有同时做两件事,但是我们所做的是将数据库上的资源锁放在一个单独的线程中,以便在它和用户交互之间切换CPU时间。CPU时间在线程之间分配。
多处理是指当你真的想在任何给定的时间做不止一件事情的时候。假设您的应用程序需要连接到6个数据库,并对每个数据集执行复杂的矩阵转换。将每个作业放在一个单独的线程中可能会有一些帮助,因为当一个连接空闲时,另一个连接可以获得一些CPU时间,但处理不会并行完成,因为GIL意味着您只使用了一个CPU的资源。通过将每个作业放在一个多处理进程中,每个作业都可以在自己的CPU上运行,并以最高效率运行。
相关问题 更多 >
编程相关推荐