当我设置两个进程来监听相同的进程时会发生什么伯克利插座?
消息是否会同时路由到两者?两者都不?两者之一?如果是这样,怎么办?
具体来说,我可以gunicorn
使用相同的路径启动两个进程,--bind unix:
并且不会发生明显的错误:
gunicorn --bind=unix:/path/to/some/socket
这似乎是一个非常简单的问题,尽管我无法在 SE 或其他地方找到明确的答案。
答案1
两个过程不能绑定(并监听)到同一个 unix 套接字。尝试绑定到已存在的 UNIX 套接字的进程将收到EADDRINUSE
错误。
具体来说,我可以使用相同的 --bind unix:/ 启动两个gunicorn进程,并且不会发生明显的错误
您的进程很可能gunicorn
在绑定到套接字文件之前实际上删除了它,因此它最终绑定到不同的Unix 套接字。
请记住,unix 套接字的实际地址是device_id:inode
元组,而不是访问它的路径。如果删除 unix 套接字,绑定到同一路径的程序最终将创建一个具有不同 inode 的不同套接字文件。
注意:所有这些都适用于“正常”、文件系统驻留的 Unix 套接字。 Linux也有抽象的unix 套接字,其中套接字的名称是其实际地址,并且不使用任何类型的文件系统对象。对于这些,您也无法将两个套接字绑定到同一地址。