我是学习 FastAPI 的新手,一开始就陷入困境。我不断收到以下错误:
(venv) root@Xue:/home/proyectos/FastAPI# uvicorn main.py:app --reload
Traceback (most recent call last):
File "/usr/bin/uvicorn", line 6, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 3254, in <module>
def _initialize_master_working_set():
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 3237, in _call_aside
f(*args, **kwargs)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 3266, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 584, in _build_master
ws.require(__requires__)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 901, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 787, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'uvloop>=0.14.0' distribution was not found …Run Code Online (Sandbox Code Playgroud) 我使用的是uvloop与websockets作为
import uvloop
coro = websockets.serve(handler, host, port) # creates new server
loop = uvloop.new_event_loop()
loop.create_task(coro)
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
一切正常,我只是想知道如果不将全局asyncio政策设置为,是否可以遇到一些意想不到的问题uvloop。据我了解,只要不使用全局asyncio方法,只要不使用全局方法,就可以设置全局策略,而直接使用传递的事件循环。那是对的吗?
我是python的新手,但是有一个使用uvloop的异步python应用程序,它使用我创建的C api模块,它也需要访问异步循环.
1)asyncio还没有这个c-api?任何在C中使用事件循环的hack?这是在哪里讨论?
2)uvloop使用我在C中熟悉的libuv.如果我可以抓取uv_loop_t指针,我可以挂钩循环.我想我可以:
A)使用PyObject*到uvloop的循环计算uv_loop_t*的偏移并使用它?假设我知道PyObject_HEAD的长度?
libuv_loop = (uv_loop_t*)((void*)(loop)+0x8);
struct __pyx_obj_6uvloop_4loop_Loop {
PyObject_HEAD
uv_loop_t *uvloop;
Run Code Online (Sandbox Code Playgroud)
B)或非hacky修改uvloop以暴露循环指针.因为我从来没有看过cython代码,所以我完全无能为力.我可以在循环上创建一个python函数,从我的C代码调用它并获取C指针吗?喜欢:
(uv_loop_t*)PyObject_CallFunctionObjArgs( getLoop, NULL )
Run Code Online (Sandbox Code Playgroud)
通过在这里添加getLoop:
https://github.com/MagicStack/uvloop/blob/master/uvloop/loop.pyx
cdef uv.uv_loop_t* _getLoop(self):
return self.uvloop
Run Code Online (Sandbox Code Playgroud) 我有一个带有协程方法的事件循环,使用asyncio.
我正在寻找使用uvloop替代以下示例的等效项。
这是一个简单的asyncio事件循环示例:
import asyncio
async def read(**kwargs):
oid = kwargs.get('oid', '0.0.0.0.0.0')
time = kwargs.get('time', 1)
try:
print('start: ' + oid)
except Exception as exc:
print(exc)
finally:
await asyncio.sleep(time)
print('terminate: ' + oid)
def event_loop(configs):
loop = asyncio.get_event_loop()
for conf in configs:
asyncio.ensure_future(read(oid=conf['oid'], time=conf['time']))
return loop
if __name__ == '__main__':
snmp_configurations = [
{'time': 5, 'oid': '1.3.6.3.2.4'},
{'time': 6, 'oid': '1.3.6.3.5.8'},
] # TODO :: DUMMY
loop = event_loop(snmp_configurations)
try:
loop.run_forever()
except KeyboardInterrupt:
pass …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据官方构建一个图像python:3.8-alpine并包含pythonuvloop包。
当我构建时,它可以在我的机器上运行,但尝试在我们的构建系统上构建相同的 Dockerfile 失败。
两个系统都运行 Linux,但我的本地计算机是最新的,而构建系统是古老的(内核和 Docker),更多详细信息在底部。
这是一个小 Dockerfile,我可以在其中重现该问题:
FROM python:3.8-alpine3.14
RUN apk add --update build-base
RUN pip install uvloop==0.16.0
Run Code Online (Sandbox Code Playgroud)
本地输出:
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM python:3.8-alpine3.14
---> 252da3e451af
Step 2/3 : RUN apk add --update build-base
---> Running in c7178804aa11
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
(1/20) Installing libgcc (10.3.1_git20210424-r2)
(2/20) Installing libstdc++ (10.3.1_git20210424-r2)
(3/20) Installing binutils (2.35.2-r2)
(4/20) Installing libmagic (5.40-r1)
(5/20) Installing file (5.40-r1)
(6/20) Installing libgomp (10.3.1_git20210424-r2) …Run Code Online (Sandbox Code Playgroud)