在RaspberryPI4-ARM上是多处理还是多线程?

时间:2020-06-26 13:16:17

标签: python-3.x

我正在编写一个Stdin-parser服务器-客户端程序,其中服务器在Raspberry4 ARM上运行。

我需要两个彼此并行运行的处理程序:

  1. 处理套接字连接的连接处理程序,接受recv,发送。 1,5)子句柄,处理收到的命令参数以将SQL查询调用到数据库并发送给客户端。

线程/进程一:

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)
  1. 一个stdin解析器,它将一个stdin-pipe从软件定义的无线电程序连续解析到SQL-db。连接处理程序不应中断此过程。

进程/线程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-线程或处理?

0 个答案:

没有答案