请教在 shell 里启动的两个 Python 进程之间要如何共享一个对象?

2021-12-22 19:04:18 +08:00
 nmecury

请教各位一个问题:

在 shell 里起两个 python 任务,这两个 python 进程之间是否有什么办法可以共享一个对象( OrderedDict 之类的),一个进程只读,一个进程只写? 我目前采用的方案是用 pickle.dumps 将这个对象(比如 OrderedDict )序列化成 bytes 类型,然后放到 SharedMemory 里,通过一个 name 来实现共享,但是感觉序列化这一步有点慢,求教有没有更快的方法。

并非不想用 multiprocessing ,一方面 python 的多线程有点蛋疼,另一方面涉及到深度学习库和 GPU 运算,担心 multiprocessing 搞不定……

3725 次点击
所在节点    Python
24 条回复
learningman
2021-12-22 19:12:00 +08:00
一个只读,一个只写,任务队列?
iBugOne
2021-12-22 19:12:16 +08:00
自己造个轮子然后两个进程用 pipe 或者 socket 通信吧,如果单次修改量不大的话每次重新传输整个对象的效率其实不行,改成“变啥传啥”就好了
thinkershare
2021-12-22 19:58:02 +08:00
没有办法, 别折腾了, 想起它办法!
qW7bo2FbzbC0
2021-12-22 20:24:25 +08:00
平行时空了属于,2 楼说的对
ch2
2021-12-22 20:31:10 +08:00
pickle 的方便是没有啥其他办法能比的,请参考这个来优化
https://www.codenong.com/26860051
yhvictor
2021-12-22 20:56:10 +08:00
linux 下 pipe 不错
heyjei
2021-12-22 21:03:18 +08:00
用 redis 做队列是最简单靠谱的方案
ClericPy
2021-12-22 22:01:30 +08:00
常用的就是 linux 下面的 pipe, A print 出来 B 从 stdin 里拿, 单进程挺烦

Websocket 和 HTTP 不考虑么, RPC 啥的, Unix domain socket 也不行么

消息队列不考虑么, 通过通信共享内存而不是反之

mmap 忘了能不能了, 太久没动过了

不让用 multiprocessing.Queue 对吧, (multiprocessing 也不是多线程啊)

linux 下面 IPC 其实也就那几个三板斧, 随便搜搜就有了, 反正我是能用队列用队列, 其他的东西心智负担太多了
ipwx
2021-12-22 22:16:46 +08:00
你得说说原始需求,你的问题抽象不可解
kaneg
2021-12-22 22:57:11 +08:00
gRPC
2i2Re2PLMaDnghL
2021-12-23 00:11:02 +08:00
你分解出来的这个子问题已经完全陷入糟糕实践范畴了,建议直接问原问题。
tinytoadd
2021-12-23 01:10:06 +08:00
通过数据库处理
Xs0ul
2021-12-23 01:43:17 +08:00
mingl0280
2021-12-23 04:59:16 +08:00
mmap 啊 mmap 啊!用这个就够了!
binux
2021-12-23 07:14:09 +08:00
干嘛不用 multiprocessing 啊,人家是多进程,没有你担心的多线程的问题啊。
zhoudaiyu
2021-12-23 08:57:32 +08:00
mkfifo
weyou
2021-12-23 09:02:48 +08:00
Pyro4 或者 Pyro5
nmecury
2021-12-23 09:54:21 +08:00
@iBugOne #2 #2 修改量还是挺大的,整个对象所有参数都改了……
killva4624
2021-12-23 10:10:52 +08:00
可以写一个第三方服务,暴露写接口和读接口分别给外部访问?这样就抽象成一个存储体了……
或者如 #11 所说,建议直接分享问题最原始的出发点,可能还有更好的办法。
codehz
2021-12-23 10:22:02 +08:00
不如一步到位直接起个数据库(划掉)
如果可以序列化成数据库的话,同一台机器上可以使用 SQLite3 ,启用 WAL 模式后读写互不干扰,可以同时进行,性能大概比每次序列化强,但是单独访问的话就不一定比 OrderedDict 快(
但是最主要的是不用自己解决复杂的线程同步问题了,而这个可是经常处理出错误的(

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

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

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

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

© 2021 V2EX