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

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

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX