使用threading.Lock而不是multiprocessing.Lock有什么原因吗?
如果一个软件项目支持一个已经把多进程功能移植到的Python版本,那么有没有理由使用 threading.Lock
而不是 multiprocessing.Lock
呢?难道 multiprocessing
的锁就不安全吗?
那么,是否还有理由使用 threading 中的任何同步工具,而这些工具在 multiprocessing
中也有呢?
3 个回答
4
multiprocessing
和threading
这两个工具虽然都是用来处理同时进行的任务,但它们的目的有点不同。threading
是用来管理一个程序内部的多个线程,而multiprocessing
则是提供一种类似线程的方式来管理多个独立的程序。
如果你的应用程序不需要创建新的进程,也就是说不需要在不同进程之间同步数据,那么使用multiprocessing
会显得有些笨重,这时候用threading
会更合适。
5
我本来以为多线程的同步工具会快很多,因为它们可以很方便地使用共享内存。不过,我想你还是得做个速度测试才能确认。此外,可能会出现一些不太好的副作用(而且文档里没有说明)。
举个例子,一个进程级别的锁可能会把这个进程里的所有线程都给锁住。如果没有锁住,释放锁的时候可能也不会唤醒这个进程里的线程。
总之,如果你想让你的代码可靠地运行,如果你在用线程,就应该使用线程同步工具;如果你在用进程,就应该使用进程同步工具。否则,代码可能只在你的平台上有效,甚至可能只在你特定版本的Python上有效。
27
线程模块的同步工具比多进程要轻便和快速,因为它不需要处理共享信号量等复杂的东西。如果你在使用线程,就应该用线程模块里的锁。而如果是进程的话,就要用多进程模块里的锁。