Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个进程之间的互连_Python_Sockets_Unix Socket - Fatal编程技术网

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别忘了总是先绑定,然后再连接,否则会出现死锁。请参阅我包含的代码