【发布时间】:2012-11-23 10:38:39
【问题描述】:
我正在尝试在 C 可执行文件和 python 脚本之间建立通信管道。 下面是 Python 脚本,奇怪的地方如下。如果我跑 python脚本如下,然后C可执行文件永远不会看到套接字上的任何数据。
但是,如果我取消注释 Reader 类(即,仅启用写入套接字) 然后 C 可执行文件总是接收套接字上的数据。有没有人解释为什么当 Reader 和 Writer 线程同时运行时这不起作用?
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) 发送数据后,Python 端应该只接收到 4 个字节,但我似乎收到了无穷无尽的数据流...
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 脚本。也许我不应该在每个线程中打开和关闭套接字?我可以“全局”打开这个套接字一次吗?
-
是的,你在两个线程中连接,每个线程创建一个单独的连接,因此“服务器”需要能够处理多个连接。是的,我建议在全球连接中打开一次(以及我的第一条评论中的问题是关于什么的)。
-
你确定 C 程序运行正确吗?
标签: python c sockets networking pipe