字符串作为具有多处理访问权限的发送缓冲区

时间:2014-07-14 17:48:02

标签: python sockets serial-port multiprocessing

在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()

1 个答案:

答案 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内容,例如在进程关闭时保持消息,在多个进程中负载平衡任务等等。