"Run client channel backup poller" 芹菜工作线程中的 GRPC 客户端错误



我在Python中使用GRPC和芹菜。当在芹菜工作器中运行调用GRPC服务器的函数时,芹菜工作器日志显示很多行:

E1018 16:17:46.449758455     101 backup_poller.cc:133]       Run client channel backup poller: {"created":"@1634573866.449735058","description":"pollset_work","file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":321,"referenced_errors":[{"created":"@1634573866.449730704","description":"Bad file descriptor","errno":9,"file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":952,"os_error":"Bad file descriptor","syscall":"epoll_wait"}]}
E1018 16:17:51.449779383      34 backup_poller.cc:133]       Run client channel backup poller: {"created":"@1634573871.449756248","description":"pollset_work","file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":321,"referenced_errors":[{"created":"@1634573871.449754215","description":"Bad file descriptor","errno":9,"file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":952,"os_error":"Bad file descriptor","syscall":"epoll_wait"}]}
E1018 16:17:56.449816371     101 backup_poller.cc:133]       Run client channel backup poller: {"created":"@1634573876.449790405","description":"pollset_work","file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":321,"referenced_errors":[{"created":"@1634573876.449786443","description":"Bad file descriptor","errno":9,"file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":952,"os_error":"Bad file descriptor","syscall":"epoll_wait"}]}

运行时,Celery Worker多次崩溃Segmentation fault (core dump)错误。我找不到这个错误的根本原因。

E1018 16:10:18.593682050      33 backup_poller.cc:133]       Run client channel backup poller: {"created":"@1634573418.593660900","description":"pollset_work","file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":321,"referenced_errors":[{"created":"@1634573418.593658189","description":"Bad file descriptor","errno":9,"file":"src/core/lib/iomgr/ev_epollex_linux.cc","file_line":952,"os_error":"Bad file descriptor","syscall":"epoll_wait"}]}
Segmentation fault (core dumped)

我最近有一个类似的错误,试图调用gRPC客户端作为芹菜工作任务的一部分。常见的命令:celery -A app worker -l info -c 1导致:

[2022-05-23 14:44:44,585: INFO/MainProcess] celery.worker.strategy: Task io_bound:get_landmarks_via_grpc[ebb65e3d-cef5-4b22-88d6-947a2560f4c1] received
Segmentation fault (core dumped)

根据这个GH问题,问题是芹菜使用预分叉池默认情况下,而gRPC不支持分叉(更多细节在这里)。

所以如果你选择一个不同的池选项,例如:'gevent',它起作用了。
celery -A app worker -l info --pool=gevent -c 1结果任务成功。

关于芹菜执行池的更多信息:https://www.distributedpython.com/2018/10/26/celery-execution-pool/