在使用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()
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐