首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >句柄无效WinError6 3+多处理

句柄无效WinError6 3+多处理
EN

Stack Overflow用户
提问于 2019-02-11 21:34:34
回答 1查看 968关注 0票数 3

我正在运行一个Python3.7Flask应用程序,它使用flask_socketio为浏览器客户端设置一个socketio服务器,另一个Python进程连接到一个单独的远程socketio服务器& exchange,另一个python进程用于从PIR传感器读取输入。

两个python进程都通过multiprocessing.Queue进行通信--但是,socketio进程总是得到[WinError6] - Invalid Handle[WinError5] - Permission Denied。我完全不知道我做错了什么。

下面是顶级(服务器)代码;它似乎没有问题

代码语言:javascript
运行
复制
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行到最后一行是问题所在。

代码语言:javascript
运行
复制
# 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')

下面是我开始这些过程的方式:

代码语言:javascript
运行
复制
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 (无法读取队列的代码)

代码语言:javascript
运行
复制
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]]})

我要把头发拔出来。我到底做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2019-02-12 22:21:58

解决方案

我不知道为什么这会解决这个问题,但是从multiprocessing.Queue切换到queue.Queue,从multiprocessing.Process切换到threading.Thread

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54639506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档