我有两个不同IP地址的齿轮管理员,我在两个客户中有40名工人,每个客户有20名工人。
这是问题所在,我每隔10分钟检查2个管理员的状态,并且他们在开始时具有相同数量的作业,但是他们的数量以不同的速度下降,admin2比admin1快3倍。
这种情况最终导致了一个问题,如果2种大量的工作,例如,job1有400000个工作,job2有400000个工作,job2比job1晚一个小时触发,那么每个工作都会先完成一半,因为另一半在admin1的手中紧紧抓住,只有admin2完成调度才能管理员调度他的工作,这是一场灾难,因为我想完成job1,但是没有完成其中的一半而继续等待其他的一半工作要完成。
答案 0 :(得分:0)
所以我找到了原因。在gearman服务器中,当一个worker被标记为sleep而不是is_noop_sent时,它只会发送noop msg,并且在发送noop msg之后,is_noop_sent被设置为false,并且只有在获取get job命令时才设置为true。
但是在python gearman中,它使用一个锁来控制recv循环,如果它无法获得锁,如果它将传递或发送pre_sleep命令 - 并且将导致服务器再也不会响应该工作者的结果。