Gevent从错误的线程(greenlet)抛出异常

问题描述 投票:0回答:1

Gevent似乎正在当前未访问网络的greenlet中引发与网络相关的错误。这是示例追溯,其中为简洁起见省略了一些细节:

Traceback (most recent call last):
  ...
  File ".../asyncforms.py", line 95, in _try_to_process_form
    self.pool.spawn(self._async_migrate_form, wrapped_form, case_ids)
  File ".../lib/python3.6/site-packages/gevent/pool.py", line 391, in spawn
    self.start(greenlet)
  File ".../lib/python3.6/site-packages/gevent/pool.py", line 601, in start
    self.add(greenlet, *args, **kwargs)
  File ".../lib/python3.6/site-packages/gevent/pool.py", line 634, in add
    if not self._semaphore.acquire(blocking=blocking, timeout=timeout):
  File "src/gevent/_semaphore.py", line 100, in gevent.__semaphore.Semaphore.acquire
  File "src/gevent/_semaphore.py", line 128, in gevent.__semaphore.Semaphore.acquire
  File "src/gevent/_abstract_linkable.py", line 192, in gevent.__abstract_linkable.AbstractLinkable._wait
  File "src/gevent/_abstract_linkable.py", line 165, in gevent.__abstract_linkable.AbstractLinkable._wait_core
  File "src/gevent/_abstract_linkable.py", line 169, in gevent.__abstract_linkable.AbstractLinkable._wait_core
  File "src/gevent/_greenlet_primitives.py", line 60, in gevent.__greenlet_primitives.SwitchOutGreenletWithLoop.switch
  File "src/gevent/_greenlet_primitives.py", line 60, in gevent.__greenlet_primitives.SwitchOutGreenletWithLoop.switch
  File "src/gevent/_greenlet_primitives.py", line 64, in gevent.__greenlet_primitives.SwitchOutGreenletWithLoop.switch
  File "src/gevent/__greenlet_primitives.pxd", line 35, in gevent.__greenlet_primitives._greenlet_switch
socket.gaierror: [Errno -9] Address family for hostname not supported

如您所见,当前线程是spawning a new greenlet中的gevent.pool.Pool,据我所知,该线程不应进入网络。我的意思是生成绿色组件的行为不应影响网络,尽管最终将在该绿色组件中运行的功能可能会影响网络,但是我认为我不需要在这里担心在追溯中没有任何证据。

为什么gevent在代码中的这个位置引发这个看似无关的网络错误?我怀疑该错误是由另一个[访问网络的greenlet引起的。有没有办法获取此错误的真实回溯上下文?

不确定以下任何一项是否相关,但取决于上下文:

启动时,该过程会修补一些东西。这有点简化了(实际代码here):

from gevent import monkey from psycogreen.gevent import patch_psycopg monkey.patch_all(subprocess=True) patch_psycopg()

编辑:a bit later,它将设置为gevent.get_hub().SYSTEM_ERROR = BaseException,以便在任何greenlet崩溃时使程序立即退出。也许这还有其他意外的副作用,例如这些令人困惑的回溯?

系统和库版本:

    [Linux djangomanage1-production 4.15.0-1041-aws#43-Ubuntu SMP Thu Jun 6 13:39:11 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux]
  • Python 3.6.8
  • gevent 1.4.0
  • greenlet 0.4.15
python gevent
1个回答
0
投票
确实,确实出现了

gevent.get_hub().SYSTEM_ERROR = BaseException

具有意外的副作用。自从我注释掉该行以来,socket.gaierror是断断续续的,但是相当频繁。
© www.soinside.com 2019 - 2024. All rights reserved.