将芹菜与Django一起使用时,select()中的filedescriptor超出范围

2024-09-28 21:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Django、芹菜和通道(带有redis后端)在基于Dajngo的后端处理任务。最近,随着事态的发展,我面临着以下问题:

ValueError('select()中的文件描述符超出范围,)

Traceback (most recent call last):
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/asgiref/sync.py", line 46, in __call__
    loop.run_until_complete(self.main_wrap(args, kwargs, call_result))
  File "/usr/lib/python3.6/asyncio/base_events.py", line 471, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 438, in run_forever
    self._run_once()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 1415, in _run_once
    event_list = self._selector.select(timeout)
  File "/usr/lib/python3.6/selectors.py", line 323, in select
    r, w, _ = self._select(self._readers, self._writers, [], timeout)
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/gevent/monkey.py", line 831, in _select
    return select.select(*args, **kwargs)
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/gevent/select.py", line 145, in select
    sel_results = _original_select(rlist, wlist, xlist, 0)
ValueError: filedescriptor out of range in select()

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/celery/app/trace.py", line 385, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/celery/app/trace.py", line 648, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/cbt/backend/cbproj/tasks/tasks.py", line 1095, in start_new_subgame_timer
    add_users_to_subgame(game, game_type)
  File "/home/cbt/backend/cbproj/tasks/tasks.py", line 1405, in add_users_to_subgame
    async_to_sync(group_send_empty_subgame_audio_game_response)(game, game_type)
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/asgiref/sync.py", line 50, in __call__
    loop.run_until_complete(loop.shutdown_asyncgens())
  File "/usr/lib/python3.6/asyncio/base_events.py", line 471, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 438, in run_forever
    self._run_once()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 1415, in _run_once
    event_list = self._selector.select(timeout)
  File "/usr/lib/python3.6/selectors.py", line 323, in select
    r, w, _ = self._select(self._readers, self._writers, [], timeout)
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/gevent/monkey.py", line 831, in _select
    return select.select(*args, **kwargs)
  File "/home/cbt/backend/venv/lib/python3.6/site-packages/gevent/select.py", line 145, in select
    sel_results = _original_select(rlist, wlist, xlist, 0)
ValueError: filedescriptor out of range in select()

我正在使用以下软件包和python 3.6

  • 芹菜==4.3.0
  • 通道==3.0.2
  • 通道redis==3.2.0

此外,当我使用django通道库提供的async_to_sync函数时,也会发生这种情况(但并非每次都是如此)。这有什么办法吗

我打开文件的限制是20000个,我绝对没有达到这个限制


Tags: runinpyselfbackendhomevenvlib
1条回答
网友
1楼 · 发布于 2024-09-28 21:19:51

根据您的错误日志,我猜您的项目中使用了monkey.patch_all,如下所示:

from gevent import monkey
monkey.patch_all()

在旧的gevent版本(<;1.5.0)中,monkey.patch_all()设置DefaultSelector = SelectSelector。当fileno>;1024,SelectSelector将引发该值错误。您可以检查此issue并将gevent升级到新版本(1.5.0+)以便解决此问题

Gevent的monkey.patch集DefaultSelector = PollSelector在新版本中

相关问题 更多 >