使用threading.Lock而不是multiprocessing.Lock有什么原因吗?

23 投票
3 回答
8583 浏览
提问于 2025-04-15 17:29

如果一个软件项目支持一个已经把多进程功能移植到的Python版本,那么有没有理由使用 threading.Lock 而不是 multiprocessing.Lock 呢?难道 multiprocessing 的锁就不安全吗?

那么,是否还有理由使用 threading 中的任何同步工具,而这些工具在 multiprocessing 中也有呢?

3 个回答

4

multiprocessingthreading这两个工具虽然都是用来处理同时进行的任务,但它们的目的有点不同。threading是用来管理一个程序内部的多个线程,而multiprocessing则是提供一种类似线程的方式来管理多个独立的程序。

如果你的应用程序不需要创建新的进程,也就是说不需要在不同进程之间同步数据,那么使用multiprocessing会显得有些笨重,这时候用threading会更合适。

5

我本来以为多线程的同步工具会快很多,因为它们可以很方便地使用共享内存。不过,我想你还是得做个速度测试才能确认。此外,可能会出现一些不太好的副作用(而且文档里没有说明)。

举个例子,一个进程级别的锁可能会把这个进程里的所有线程都给锁住。如果没有锁住,释放锁的时候可能也不会唤醒这个进程里的线程。

总之,如果你想让你的代码可靠地运行,如果你在用线程,就应该使用线程同步工具;如果你在用进程,就应该使用进程同步工具。否则,代码可能只在你的平台上有效,甚至可能只在你特定版本的Python上有效。

27

线程模块的同步工具比多进程要轻便和快速,因为它不需要处理共享信号量等复杂的东西。如果你在使用线程,就应该用线程模块里的锁。而如果是进程的话,就要用多进程模块里的锁。

撰写回答