1
我想在C可执行文件和python脚本之间建立一个通信管道。 下面是Python脚本,关于它的奇怪之处在于以下内容。如果我运行 下面的python脚本,那么C可执行文件从不会看到套接字上的任何数据。但是,如果我取消对Reader类的注释(即仅启用对套接字的写入) ,则C可执行的总是在套接字上接收数据。有没有人解释为什么当Reader和Writer线程同时运行时这不起作用?Python和奇怪的套接字行为
class Reader(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
def run(self):
while True:
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")
nonce = s.recv(4)
s.close
if len(nonce) == 4:
print("Result received \n")
class Writer(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
payload = "Hello World"
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")
s.send(payload)
s.close()
reader = Reader()
writer = Writer()
reader.start()
writer.start()
try:
while True:
sleep(10000)
except KeyboardInterrupt:
print("Terminated")
编辑:
至于建议,我试图在全球范围内打开连接,如下但是这给了我另外两个问题:
1)发送数据后,只有4个字节应收到Python的结束,但似乎我收到了层出不穷的数据...
2)我在哪里可以关闭这个全局打开的流?
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")
class Reader(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
def run(self):
while True:
nonce = s.recv(4)
if len(nonce) == 4:
print("Result received \n")
class Writer(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
payload = "Hello World"
s.send(payload)
reader = Reader()
writer = Writer()
reader.start()
writer.start()
try:
while True:
sleep(10000)
except KeyboardInterrupt:
print("Terminated")
C程序可以处理多个连接吗?这导致了问题,为什么打开两个不同的连接?为什么在一个循环中一次又一次地重复连接,而不是在循环之外打开一次连接,或者为两个线程使用一个全局连接? –
不需要多重连接,python脚本读取数据,通过套接字将它发送到C exe,这会做一些工作,然后将结果发送回Python脚本。也许我不应该在每个线程中打开和关闭套接字?我可以一次性“全局”打开此套接字吗? – Patrick
是的,你在两个线程中连接,每个线程创建一个单独的连接,所以“服务器”需要能够处理多个连接。是的,在全球范围内开放一次是我的建议(以及我第一次评论中的问题)。 –