我正在编写一个Stdin-parser服务器-客户端程序,其中服务器在Raspberry4 ARM上运行。
我需要两个彼此并行运行的处理程序:
线程/进程一:
PORT=9001
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('127.0.0.1', PORT))
input_list =[server_socket]
def start(server_socket):
server_socket.listen()
print('socket created')
def client_accept(server_socket):
client_socket, client_address = server_socket.accept()
if client_socket:
print(f'client {client_address} connected')
input_list.append(client_socket)
return client_socket
def client_sender(client_socket, payload):
client_socket.sendall(bytes(payload, encoding ='utf-8'))
def client_recv(client_socket):
data = client_socket.recv(32).decode('utf-8')
data = data.strip('\n')
if data:
print(f'resceiving...')
request_handler(client_socket, data)
def request_handler(client_socket, data):
if data =='hi':
client_sender(client_socket, data)
def connector_loop():
start(server_socket)
while True:
read, _,_ =select.select(input_list,[],[])
for i in read:
if i == server_socket:
client_accept(i)
else:
client_recv(i)
进程/线程2:
def parse_data():
for line in sys.stdin:
msg= re.findall('Alpha:\s(.*)',line)
numb= re.findall('Numeric:(.*)',line)
address= re.findall('Address:\s(\d*)',line)
message =""
dateTimeObj = datetime.now()
timestampStr = dateTimeObj.strftime("%d-%b-%Y (%H:%M:%S)")
if msg:
if "Poll" not in msg:
message=msg[0]
elif numb:
message=numb[0]
return address[0], timestampStr, message
def live_parser():
msg_adress, msg_date, masg_msg = parse_data()
payload= f"Adress: {msg_adress}, Date: {msg_date}, Message:{masg_msg}"
return payload
def save_to_db(address, date, message):
conn = sqlite3.connect("Pocsag_message.db")
cur = conn.cursor()
#get the count of tables with the name
cur.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='messages' ''')
values= (address, date, message)
#if the count is 1, then table exists
if cur.fetchone()[0]==1 :
cur.execute("insert into messages values (?, ?, ?)", values)
else :
cur.execute("create table messages (address text, date date, message text)")
conn.commit()
cur.execute("insert into messages values (?, ?, ?)", values)
conn.commit()
cur.close()
conn.close()
def parser_loop():
while True:
parse_data()
对于连接处理程序,我试图使用select.select(),但是恐怕这不能同时运行两个进程吗? stdin-parse应该始终运行,否则会丢失SDR中的数据。
哪种类型的异步最适合ARM-线程或处理?