背景:在celery中多worker下多进程并发的情况下,对有些公共数据涉及到进程安全问题,所以需要对这些数据进行加锁操作。
在Python中threading是多线程,而mutiprocessing是多进程。我们这里多worker采用的是mutiprocessing
1. 创建一个锁
lock = multiprocessing.Lock()
2. 获取锁
lock.acquire()
3. 保证redis中num对应值的安全性
Redis.write("num", str(int(Redis.read("num")) + 1), 60 * 60)
4. 释放锁
lock.release()
以下为示例代码
from celery import Celery
import random
import logging
import time
import rpy2.robjects as robjects
from app.utils.util import Redis
import multiprocessing
celery_app = Celery(__name__)
logger = logging.getLogger(__name__)
# 1. 创建一个锁
lock = multiprocessing.Lock()
@celery_app.task
def test_task(x):
logger.info(str(x) + '---start: ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
robjects.r('''
Sys.sleep(1)
print("-------------x--------------")
print(%s)
''' % x)
time.sleep(random.randint(1, 10))
# 2. 获取锁
lock.acquire()
# 3. 保证redis中num对应值的安全性
Redis.write("num", str(int(Redis.read("num")) + 1), 60 * 60)
# 4. 释放锁
lock.release()
logger.info(str(x) + '---end: ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print('x: ', str(x))