gunicorn部署django,开启多个进程,重复初始化任务,造成Kafka数据被重复消费

本文探讨了在使用Gunicorn部署Django应用时,如何解决多进程并发执行特定任务的问题,尤其是在消费Kafka消息场景下。通过使用文件锁机制,确保了关键任务仅在一个进程中运行,而其他进程则能正常处理HTTP请求。

在使用gunicorn部署django过程中,发现gunicorn在开多个进程的同时,也会将我的定义的初始化任务在各个进程开启一次

# 开启了四个进程
gunicorn --chdir projectpath projectname.wsgi:application -b 0.0.0.0:8020 -w 4

那么涉及到消费kakfa这种任务,就出现了问题,我既要多个进程接收http上报数据,又要kafka只在一个进程中被消费,就需要借助文本锁

具体使用方法如下:
import fcntl
import atexit

def init_tasks():
    '''我们只想要在一个进程中运行的任务'''

f = open("scheduler.lock", "wb")

def unlock():
    fcntl.flock(f, fcntl.LOCK_UN)
    f.close()
# 注册非阻塞互斥锁
atexit.register(unlock)

def init_ok():
    ''' 这里可以写可以让多个进程都执行的任务'''

	# 为唯一任务加上文本锁,第一个进程初始化后会占用锁,其他进程执行时就无法操作锁,从而无法执行任务
    try:
        fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
        init_tasks()
    except:
        pass
    pass

init_ok()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值