简体   繁体   中英

Python multiprocessing queue not sending data to parent process

So I've got a bluetooth connection from an arduino reading a joystick and sending the axis readout over bluetooth to my raspberry pi (4b running ubuntu 20.10). I've confirmed it's receiving this data too.

Now I try to run this bluetooth communcication in a separate process using the python multiprocessing module. to access the data from the arduino, I give the function a queue from the parent main process to put the data in there. Then in the main function I continuously try to read from this queue and process the data there.

The queue in the parent process always remains empty, however, and as such I can't process the data any further.

How can I get the data from the bluetooth process back to the main process?

main.py
#!/usr/bin/env python3
import time
import logging
import multiprocessing as mp
import bluetoothlib

logging.basicConfig(level=logging.DEBUG)

logging.info("creating queue")
global q
q = mp.Queue()      

def main():
    try:
        logging.info("starting bluetooth process")
        p = mp.Process(target=bluetoothlib.serlistener, args=(q,))
        p.start()
    except:
        logging.error("unable to start bluetooth listener")
        
    logging.info("start reading from queue")
    while True:
        #logging.info(q.qsize())
        if not q.empty():
            mss = q.get()
            logging.info(mss)
            #do something with data
        elif q.empty():
            logging.info("queue empty")
            
        time.sleep(1)
            

main()
bluetoothlib.py
#!/usr/bin/env python3
import os
import serial
import io

def serlistener(q):
    print ("creating connection")
    btConn = serial.Serial("/dev/rfcomm0", 57600, timeout=1)
    btConn.flushInput()
    sio = io.TextIOWrapper(io.BufferedRWPair(btConn, btConn, 1),encoding="utf-8")
    
    print ("connection created, starting listening")
    while btConn.is_open:
        try:
            mss = sio.readline()
            q.put(mss)
        except:
            print("error")                                                                              
            break

At thelizardking34's suggestion, I relooked at the global stuff I'd been messing with and after correcting it, the code as now given in the question works.

Thanks to thelizardking34!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM