如何在 Python 中进行跨进程跨脚本同步?

2014 年 11 月 8 日
 coofly
脚本A和脚本B之间需要进行同步,它们之间的启动先后顺序不定
我尝试把multiprocessing.Lock()定义在共同import的文件中
然后果然没有效果,这种情况我应该怎么办呢?

以前都是做windows开发,遇到这种问题,两个进程创建一个同名的Mutex就搞定了
虽然也可以用win32 api搞定,但是有没有与平台无关的办法?

第一次在v2ex问问题,谢谢各位!
5146 次点击
所在节点    Python
11 条回复
20150517
2014 年 11 月 8 日
redis
way2exluren
2014 年 11 月 8 日
打开绝对路径的文件?
gamexg
2014 年 11 月 8 日
绑端口?
hahastudio
2014 年 11 月 8 日
既然是两个脚本,想必就是两个 python 进程了
IPC 的话基本没有简单的解决方案= =
基本上简单的就是文件和端口了吧= =
跨平台的话,像你说的 Windows 有 mutex 的接口,但是 Linux 还有 mmap 呢,不过这两个都不能算跨平台了= =
试试这个 recipe
http://code.activestate.com/recipes/519626-simple-file-based-mutex-for-very-basic-ipc/
EPr2hh6LADQWqRVH
2014 年 11 月 8 日
mkfifo
mahone3297
2014 年 11 月 8 日
我感觉,这个问题就是,多进程间如何通信?
wibile
2014 年 11 月 8 日
mckelvin
2014 年 11 月 8 日
如果LZ只是要一个互斥锁,可以用 fcntl。和 @hahastudio 说的是同一个东西,之前没注意到他的回复于是写了一份:

https://gist.github.com/mckelvin/0b799d940409d94208fe

实现的效果是同一时间 script1.pyscript2.py 只有一个在跑。就是LZ说的「两个进程创建一个同名的Mutex」的效果吧?

不过这么做可能会发生 script1 - script1 - script2 - script1(同一个脚本连着跑两次另一个缺没跑过)这样的执行序列.
fakevam
2014 年 11 月 8 日
尝试cffi,在python里面调用win32/posix API解决问题好了
不要用ctypes,ctypes太折磨人了,当然选第三方模块也可以
mckelvin
2014 年 11 月 8 日
匿了…… 没主意到LZ说Windows http://code.activestate.com/recipes/65203/ 可能可以。
coofly
2014 年 11 月 9 日
这应该是一种比较常见的需求吧,怎么会是这个样子……

判断平台用文件锁搞定了,谢谢各位!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/144848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX