Python 两个进程之间的互连
我有两个进程,需要在它们之间发送消息。这是第一个文件:Python 两个进程之间的互连,python,sockets,unix-socket,Python,Sockets,Unix Socket,我有两个进程,需要在它们之间发送消息。这是第一个文件: import socket from info import socket1_filename, socket2_filename socket1 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) socket1.bind(socket1_filename) socket2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) socket
import socket
from info import socket1_filename, socket2_filename
socket1 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket1.bind(socket1_filename)
socket2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket2.connect(socket2_filename)
这是第二个文件:
import socket
from info import socket1_filename, socket2_filename
socket1 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket1.connect(socket1_filename)
socket2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket2.bind(socket2_filename)
下面是info
模块:
socket1_filename = '/tmp/socket1'
socket2_filename = '/tmp/socket2'
当然这件事行不通,这是一种僵局:
Traceback (most recent call last):
File "process1.py", line 7, in <module>
socket2.connect(socket2_filename)
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 2] No such file or directory
回溯(最近一次呼叫最后一次):
文件“process1.py”,第7行,在
socket2.connect(socket2_文件名)
文件“/usr/lib/python2.7/socket.py”,第224行,meth格式
返回getattr(self.\u sock,name)(*args)
socket.error:[Errno 2]没有这样的文件或目录
那么,如果我需要能够在两个端点发送和接收消息,那么如何实现进程之间的简单互连呢?正如Tichodroma所说,您需要重试。 定义一个超时时间(比如10秒),当该时间未过期时,捕获socket.error并继续重试。如果超时后仍然失败,请大声失败 在两个进程上尝试连接之前,您需要进行
bind
,否则将永远无法成功
TIMEOUT= 10 #seconds
from datetime import datetime, timedelta
from time import sleep
timeout= datetime.now() + timedelta(seconds=TIMEOUT)
socket1 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket2.bind(socket2_filename)
s1_done= False
while (not s1_done) and (datetime.now() < timeout):
try:
socket1.connect(socket1_filename)
s1_done= True
except socket.error:
sleep(1)
if not s1_done:
raise Exception("Failed to connect")
TIMEOUT=10秒
从datetime导入datetime,timedelta
从时间上导入睡眠
timeout=datetime.now()+timedelta(秒=超时)
socket1=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM)
socket2=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM)
socket2.bind(socket2_文件名)
s1_done=False
while(未完成)和(datetime.now()<超时):
尝试:
socket1.connect(socket1_文件名)
s1_done=真
除socket.error外:
睡眠(1)
如果未完成,请执行以下操作:
引发异常(“连接失败”)
可能捕获异常并重试。是的,这是一个非常愚蠢的问题。谢谢你们@DmitryMikhaylov别忘了总是先绑定,然后再连接,否则会出现死锁。请参阅我包含的代码