首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程中的服务器(Python3.9.0+aiohttp):RuntimeError:关机后无法在退出时注册

线程中的服务器(Python3.9.0+aiohttp):RuntimeError:关机后无法在退出时注册
EN

Stack Overflow用户
提问于 2020-12-27 23:25:40
回答 2查看 2.8K关注 0票数 1

这段代码(在线程中运行的最小服务器,取自here的代码)在Python3.8.3中工作得很好,但在Python3.9.0中引发了一条错误消息:

代码语言:javascript
复制
import asyncio
import threading
from aiohttp import web


def aiohttp_server():
    def say_hello(request):
        return web.Response(text='Hello, world')

    app = web.Application()
    app.add_routes([web.get('/', say_hello)])
    runner = web.AppRunner(app)
    return runner


def run_server(runner):
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(runner.setup())
    site = web.TCPSite(runner, 'localhost', 8080)
    loop.run_until_complete(site.start())
    loop.run_forever()


t = threading.Thread(target=run_server, args=(aiohttp_server(),))
t.start()

错误消息:

代码语言:javascript
复制
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "/home/alkhinoos/nikw/nikw/z2.py", line 21, in run_server
    loop.run_until_complete(site.start())
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/usr/lib/python3.9/site-packages/aiohttp/web_runner.py", line 121, in start
    self._server = await loop.create_server(
  File "/usr/lib/python3.9/asyncio/base_events.py", line 1460, in create_server
    infos = await tasks.gather(*fs, loop=self)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 1400, in _create_server_getaddrinfo
    infos = await self._ensure_resolved((host, port), family=family,
  File "/usr/lib/python3.9/asyncio/base_events.py", line 1396, in _ensure_resolved
    return await loop.getaddrinfo(host, port, family=family, type=type,
  File "/usr/lib/python3.9/asyncio/base_events.py", line 856, in getaddrinfo
    return await self.run_in_executor(
  File "/usr/lib/python3.9/asyncio/base_events.py", line 809, in run_in_executor
    executor = concurrent.futures.ThreadPoolExecutor(
  File "/usr/lib/python3.9/concurrent/futures/__init__.py", line 49, in __getattr__
    from .thread import ThreadPoolExecutor as te
  File "/usr/lib/python3.9/concurrent/futures/thread.py", line 37, in <module>
    threading._register_atexit(_python_exit)
  File "/usr/lib/python3.9/threading.py", line 1374, in _register_atexit
    raise RuntimeError("can't register atexit after shutdown")
RuntimeError: can't register atexit after shutdown

怎么回事?Python 3.9.1也出现了同样的问题。这个问题在Python 3.9.2中解决了吗?也许是a relative issue here

EN

回答 2

Stack Overflow用户

发布于 2021-03-30 00:21:24

不知道您做了什么,但是我使用了127.0.0.1而不是localhost,错误被解决了!

票数 2
EN

Stack Overflow用户

发布于 2021-06-30 11:04:58

如Python手册- Thread Objects中所述

其他线程可以调用线程的

()方法。这会阻塞调用线程,直到其join()方法被调用的线程被终止。

在主线程中调用t.start()后,主线程将退出。然后,该过程结束。

如果你想永远运行这个子线程,或者直到它退出,你应该在t.start()之后在主线程中调用t.join()

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

https://stackoverflow.com/questions/65467329

复制
相关文章

相似问题

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