我正在创建一个任务(通过继承celery.task.Task),创建与Twitter的流API的连接。对于Twitter API调用,我使用tweepy。正如我从celery文档中读到的那样,'没有为每个请求实例化任务,而是在任务注册表中将其注册为全局实例。我期待每当我为任务调用apply_async(或延迟)时,我将访问最初实例化但不会发生的任务。而是创建自定义任务类的新实例。我需要能够访问原始的自定义任务,因为这是我终止由tweepy API调用创建的原始连接的唯一方法。
如果这会有所帮助,可以使用以下代码:
from celery import registry
from celery.task import Task
class FollowAllTwitterIDs(Task):
def __init__(self):
# requirements for creation of the customstream
# goes here. The CustomStream class is a subclass
# of tweepy.streaming.Stream class
self._customstream = CustomStream(*args, **kwargs)
@property
def customstream(self):
if self._customstream:
# terminate existing connection to Twitter
self._customstream.running = False
self._customstream = CustomStream(*args, **kwargs)
def run(self):
self._to_follow_ids = function_that_gets_list_of_ids_to_be_followed()
self.customstream.filter(follow=self._to_follow_ids, async=False)
follow_all_twitterids = registry.tasks[FollowAllTwitterIDs.name]
对于Django视图
def connect_to_twitter(request):
if request.method == 'POST':
do_stuff_here()
.
.
.
follow_all_twitterids.apply_async(args=[], kwargs={})
return
任何帮助将不胜感激。 :d
编辑:
对于问题的其他上下文,每当调用filter()方法时,CustomStream对象都会创建一个httplib.HTTPSConnection实例。只要有另一次尝试创建一个连接,就需要关闭此连接。通过将customstream.running设置为False来关闭连接。
答案 0 :(得分:0)
如果您认为任务不是出于某种原因,那么该任务只应实例化一次, 我建议你加一个
打印( “实例化”) 导入回溯 traceback.print_stack()
到Task.__init__
方法,这样你就可以知道这会发生什么。
我认为你的任务可以更好地表达出来:
from celery.task import Task, task
class TwitterTask(Task):
_stream = None
abstract = True
def __call__(self, *args, **kwargs):
try:
return super(TwitterTask, self).__call__(stream, *args, **kwargs)
finally:
if self._stream:
self._stream.running = False
@property
def stream(self):
if self._stream is None:
self._stream = CustomStream()
return self._stream
@task(base=TwitterTask)
def follow_all_ids():
ids = get_list_of_ids_to_follow()
follow_all_ids.stream.filter(follow=ids, async=false)