哪个池类应该在芹菜中使用prefork,eventlet或gevent?

时间:2017-03-22 10:12:23

标签: python celery celery-task

我有3个远程工作人员,每个人都使用默认池(prefork)和单个任务运行。

单个任务需要2到5分钟才能完成,因为它在许多不同的工具上运行并在ELK中插入数据库。

worker命令: 芹菜 - 项目工作人员-l info

我应该使用哪个池类来加快处理速度?

还有其他方法可以提高性能吗?

2 个答案:

答案 0 :(得分:9)

很有趣,这个问题滚动了。

我们刚刚从eventlet切换到gevent。 Eventlet引发了悬挂经纪人关系,最终导致工人陷入困境。

一般提示:

  • 如果您受I / O限制,请使用更高的concurreny,我将从25开始,检查cpu加载并从那里进行调整,目标是使用该过程99.9%的CPU使用率。
  • 如果你的员工人数增加,你可能想要使用--with-gossip和--without-mingle。
  • 不要使用RabbitMQ作为你的结果后端(redis ftw!),但RabbitMQ是我们的首选代理商(redis上的amqp仿真和芹菜的hacky async-redis解决方案很臭,导致了我们过去很多悲痛。)

调整芹菜工人的更高级选项:

  • 将每个工作进程固定到一个核心,以避免移动进程的开销(taskset是你的朋友)
  • 如果一个工作人员并不总是工作,考虑与一个或两个其他进程共享核心,如果一个进程具有优先权,则使用nice

答案 1 :(得分:0)

我在django项目中使用芹菜。
使用eventlet时,我会遇到很多错误,例如

CLLocationManager *manager = [CLLocationManager new];
manager.allowsBackgroundLocationUpdates = YES;
manager.pausesLocationUpdatesAutomatically = NO;
manager.showsBackgroundLocationIndicator = YES;
manager.distanceFilter = 50; // meters
manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
manager.delegate = self;

dns timeout

另一个错误:

eventlet==0.25.2
GreenSSLSocket does not have a public constructor

。好伤心。

所以我用eventlet==0.22.0替换了eventlet,一切正常运行