WinError6 Неверный дескриптор многопроцессорной обработки Python 3+ - PullRequest
0 голосов
/ 12 февраля 2019

Я использую приложение Python 3.7 Flask, которое использует flask_socketio для настройки сервера socketio для клиентов браузера, другой процесс python для подключения к отдельному удаленному socketio серверу и обмена сообщениями, а также другой процесс python для чтениявходной сигнал от датчика PIR.

Оба процесса Python связываются по multiprocessing.Queue, но процесс socketio всегда получает либо [WinError6] - Invalid Handle, либо [WinError5] - Permission Denied.Я абсолютно не знаю, что я делаю неправильно.

Вот код верхнего уровня (сервер); У него, похоже, нет проблем :

from shotsocket import init as shotsocket_init
from shotsocket import util as matchmaking_util
import multiprocessing, os, config, uuid

match_queue = multiprocessing.Queue()
shot_queue = multiprocessing.Queue()

app = Flask(__name__, static_url_path='', static_folder='templates')
socketio = SocketIO(app)

_rooms = [] # I don't plan to keep this in memory, just doing it for debug / dev 

...

Вышеприведенное работает отлично и модно.Проблема от 2-й до последней строки в следующем блоке.

# THIS IS THE FUNC WHERE WE ARE TRYING TO USE 
# THE BROKEN QUEUE

@socketio.on('connect')
def listen():
    room_key = str(uuid.uuid4())
    join_room(room_key)
    _rooms.append((room_key, request.sid))
    possible_match = matchmaking_util.match_pending_clients(_rooms)
    if possible_match:
        shot_queue.put_nowait(possible_match)
        print('put it in there')

Вот как я запускаю эти процессы:


if __name__ == '__main__':
    debug = os.environ.get('MOONSHOT_DEBUG', False)
    try:
        proc = multiprocessing.Process(target=start, args=(debug,match_queue))
        proc.start()
        shot_proc = multiprocessing.Process(target=shotsocket_init, args=(shot_queue,))
        shot_proc.start()
        socketio.run(app, host='0.0.0.0')
    except KeyboardInterrupt:
        socketio.stop()
        proc.join()
        shot_proc.join()

А вот и весь shotsocket (код, который не может прочитать очередь )

import socketio, multiprocessing # mp for the type

sio = socketio.Client(engineio_logger=True)
sio.connect('redacted woot', transports=['websocket'])


@sio.on('connect')
def connect():
    print("connected to shot server")

def init(queue: multiprocessing.Queue):
    while True:
        try:
            # WE NEVER GET PAST THIS LINE
            print(queue.get())
        except Exception as e:
            continue
        if not queue.empty():
            print('queue empty')
            shot = queue.get()
            print(shot)         
            match_id, opponents = shot
            sio.emit('start', {'id': match_id, 'opponents': [opponents[0], opponents[1]]})

Я вырываю волосы.Какого черта я делаю не так?

1 Ответ

0 голосов
/ 13 февраля 2019

Решение

Я понятия не имею, почему это решает проблему, но переключение с multiprocessing.Queue на queue.Queue и multiprocessing.Process на threading.Thread сделало это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...