在Python中,如何使用数据行(字符串)填充缓冲区并使用第二个进程使用它?这里有很多例子来添加和读取字符串中的行,但我需要从字符串中删除消耗的行,以使字符串充当缓冲区。
示例:从串行端口读取偶发数据并通过TCP / IP将其发送到服务器。在一个循环中逐行并且没有缓冲=没有问题,但是如果目的地无法访问,则数据应该存储在缓冲区中,然后在连接可用时发送。
#!/usr/bin/python
import serial
import socket
from multiprocessing import Process
ip = "someURL"
port = 12345
ser = serial.Serial("/dev/ttyUSB0", 57600, timeout=0)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def serial_reader():
while True:
for line in ser.read():
try:
response = ser.readlines(None)
response = str(response)
message = response[7:]
except:
print datetime.datetime.now(), " No data from serial connection."
##
def data_sender():
s.connect((ip, port))
while True:
for line in queue():
try:
s.send(message)
except:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
continue
except:
s.close()
##
if __name__ == '__main__':
Process(target=serial_reader).start()
Process(target=data_sender).start()
答案 0 :(得分:1)
我认为实现目标的最佳方法是使用队列:
from multiprocessing import Queue
专门使用queue.put()
在队列中放置一个字符串,queue.get()
来检索它,并queue.task_done()
表示任务已完成。
https://docs.python.org/2/library/queue.html#Queue.Queue
如果您需要更大的枪,请查看实现AMPQ协议的RabbitMQ和python库,例如rabbitpy
。这是进程间/内部服务通信的事实标准,并且已经有许多usefyl内容,例如在进程关闭时保持消息,在多个进程中负载平衡任务等等。