我正在写一个多人游戏包使用websockets。我在包中有一个服务器文件和一个客户机文件,并设置了两个单独的测试文件来测试包,一个是服务器,一个是客户机。
我的问题是,当运行服务器并通过客户端连接到它时,它会连接,然后立即断开连接。当查看回溯时,没有明显的原因可以解释为什么它断开连接。
回溯:
Connected
connection handler failed
Traceback (most recent call last):
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\site-packages\websockets\legacy\server.py", line 240, in handler
await self.ws_handler(self)
File "C:\Users\diarm\Documents\GitHub\pymultiplayer\pymultiplayer\server.py", line 16, in connection_handler
helper_process.start()
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
^^^^^^^^^^^^^^^^^
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\context.py", line 336, in _Popen
return Popen(process_obj)
^^^^^^^^^^^^^^^^^^
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\popen_spawn_win32.py", line 94, in __init__
reduction.dump(process_obj, to_child)
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle '_asyncio.Future' object
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\spawn.py", line 111, in spawn_main
new_handle = reduction.duplicate(pipe_handle,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\diarm\AppData\Local\Programs\Python\Python311\Lib\multiprocessing\reduction.py", line 79, in duplicate
return _winapi.DuplicateHandle(
^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError 6] The handle is invalid
所有文件:https://github.com/iamdeedz/pymultiplayer/blob/backbone
我查了OSError: [WinError 6] The handle is invalid
和TypeError: cannot pickle '_asyncio.Future' object
没有结果。我在其他地方问过这个问题,没有得到答案。我试着连接到服务器,并发送一些测试数据。
任何帮助感激不尽。
1条答案
按热度按时间y53ybaqx1#
问题是这两行:
正如您已经正确识别的,错误是
TypeError: cannot pickle '_asyncio.Future' object
。这是因为Future
属于您正在运行的主进程上的一个线程,该线程是主进程的事件循环。当你用POpen
把它发送到一个新的进程时,它到这个线程的链接就被破坏了,它永远不会被更新。在不知道代码的其余部分的情况下,很难说如何解决这个问题,但一般来说,您应该
await
这个asyncio.Future
的结果/异常,并将其发送到子进程。如果您需要在两者之间进行持续的通信,即主进程和您创建的POpen
进程,您可以查看Queue
s或Pipe
s,其中Queue
是构建在Pipe
之上的一些额外功能。