我在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/