Python 分布式进程如何交换数据?

我知道多进程,也知道多进程交换数据用队列Queue和管道Pipes

问题一:

队列和管道是在内存中交换数据?还是在文件中交换数据?win和linux上实现会有不同吗?

问题二:

一般的多进程队列和管道的用法:

# 在一个python文件中指定,然后把队列作为参数传入进程函数:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))

而分布式进程的意思是说(我自己说的):
两个py文件

test1.py
test2.py

分别运行其(不是同时运行):

# 15:37
python test1.py
# 15.38
python test2.py

这样也是两个进程,只是运行在不同的python窗口,他们怎么交换数据?这用管道和队列就不能实现了吧
我也不知道我为啥会问这样的问题...
原来我的做法是,直接用tcp把它们连起来,完全够用,还可以通过网络分布出去
但是我就想直接在本地,没必要用网络吧,能不能直接让它两在内存中就交换数据?
这样岂不美哉233
谢谢

阅读 3.5k
2 个回答

test1和test2共享内存通信方式:
test1向redis的key1中写入数据,test2读取redis的key1数据,用于流式传输,与队列不同,无法判断重读或未读

test1和test2队列通信方式:
老老实实用socket吧,反正多文件的进程间你也没办法加入原子锁

新手上路,请多包涵

我觉得有两种解决方案:
1.把Queue注册到网络

from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()


# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

# 把Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')

2.通过数据库如redis交互。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题