在 Django 模型信号上创建 beanstalkd 作业
Creating beanstalkd jobs on django model signals
我想在保存 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');
但是我不喜欢这样的事实,即每次收到信号时我都会创建一个新连接。我的问题是:
- 如果我在模块顶部的函数外部连接到 beanstalkd 并重用该连接,这样会好吗?
- 但是,如果我重新使用连接并且由于某些原因连接断开,整个过程就会受到影响,对吗?那么,什么是更好的解决方案?
最后我采用了这种方法:
我在 common/util/beanstalkd_client.py:
中创建了一个 class
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 的连接断开怎么办!
我想在保存 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');
但是我不喜欢这样的事实,即每次收到信号时我都会创建一个新连接。我的问题是:
- 如果我在模块顶部的函数外部连接到 beanstalkd 并重用该连接,这样会好吗?
- 但是,如果我重新使用连接并且由于某些原因连接断开,整个过程就会受到影响,对吗?那么,什么是更好的解决方案?
最后我采用了这种方法:
我在 common/util/beanstalkd_client.py:
中创建了一个 classfrom 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 的连接断开怎么办!