我希望在保存django模型时创建beanstalkd作业。为此,我正在侦听模型的post_save信号,相关处理程序正在创建一个beanstalkd作业,如下所示(在myapp/signals.py中):
@receiver(post_save, sender=MyModel)
def create_job(sender, **kwargs):
beanstalk = beanstalkc.Connection(
host='example.com',
port=11300
)
beanstalk.use('test')
beanstalk.puts('job');然而,我不喜欢这样的事实,我正在创建一个新的连接,每次我收到一个信号。我的问题是:
发布于 2016-11-30 08:31:01
最后,我遵循了这种方法:
我在公共/util/beanstalkd_client.py中创建了一个类:
from django.conf import settings
import beanstalkc
class _BeanstalkdClient:
def __init__(self):
self.beanstalk = beanstalkc.Connection(
host=settings.BEANSTALKD.get('host'),
port=int(settings.BEANSTALKD.get('port'))
)
self.job = None
def watch(self, tube, ignore_default=True):
self.beanstalk.watch(tube)
if ignore_default:
self.beanstalk.ignore('default')
def use(self, tube):
self.beanstalk.use(tube)
def reserve(self):
self.job = self.beanstalk.reserve()
return self.job
def put(self, payload):
self.beanstalk.put(payload)
beanstalkd_client = _BeanstalkdClient()这允许我重用beanstalkd_client并处理内部的连接。因为python总是要创建一个模块的实例,所以beanstalkd_client模块总是有一个到beanstalkd的连接。
然后在我的signals.py中:
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.conf import settings
from common.util.beanstalkd_client import beanstalkd_client
beanstalkd_client.use(settings.BEANSTALKD.get('my_tube_name'))
@receiver(post_save, sender=Address)
def es_create_index(sender, **kwargs):
beanstalkd_client.put('my awesome job!')然而,这仍然不能处理第二点:如果连接到beanstalkd是坏的!
https://stackoverflow.com/questions/40863699
复制相似问题