如何在我的主要 Django 应用程序进程中访问 Celery 任务的结果?或者,如何从单独的进程发布到现有套接字连接?
我有一个用户可以收到分数的应用程序。当记录分数时,会进行计算(目标进展等),并根据这些计算向感兴趣的用户发送通知。计算可能需要 30 秒以上,因此为了避免 UI 缓慢,这些操作通过 Celery 任务在后台进程中执行,由我的 Score 模型的 post_save 信号调用。
理想情况下,我的 Nofication 模型上的 post_save 信号会向订阅的客户端发布消息(我正在使用 django-socketio,gevent-socketio 的包装器)。这看起来很简单......
但是在尝试了以下之后我不确定这是可能的:
将 gevent 的 SocketIOServer 实例传递给任务调用的回调方法,但这需要 pickle 传递的对象,这是不可能的
将套接字的 session_id(不同于 Django 的 session_id)存储在 memchache 中,并在 Celery 任务进程中检索它。
使用 Redis pubsub,因此在后台进程中创建的模型上由 post_save 信号调用的方法可以简单地发布到 Redis channel ,但在主应用程序进程(可以访问套接字连接)中监听聊天 channel 会阻塞应用程序的其余部分。
我还尝试为每个 Redis 客户端生成新线程,这些线程是为每个套接字订阅者创建的。据我所知,这需要产生一个新的 gevent.greenlets.Greenlet,并且 gevent 不能在多线程中使用
当然,这是一个已解决的问题。我错过了什么?
最佳答案
你已经有了django-socketio,用redis写一个pub/sub会很可惜:)
客户端:
var socket = new io.Socket();
socket.connect();
socket.on('connect', function() {
socket.subscribe({{ score_update_channel }});
});
服务器端:
from django_socketio import broadcast_channel
def user_score_update(user):
return 'score_updates_user_%s' % user.pk
channel = user_score_update(user)
broadcast_channel(score_result_data, channel)
需要在django-socketio进程上运行广播;如果您从不同的进程(celery worker)运行它,它将无法工作( channel 在内存中被 django-socketio 进程引用);您可以通过将其包装在 View 中来解决此问题,当任务完成时 celery 将调用(发出真正的 http 请求)。
关于带 celery 的 django-socketio : send to socket after async task completes in separate process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11445247/
我正在用RubyonRails重写Django应用程序,并希望为用户保留旧密码。Django使用PBKDF2SHA1作为加密机制。所以我有一个加密密码是这个pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=原密码是2bulls在Ruby中,我使用PBKDF256gem和base64进行检查。Base64.encode64PBKDF256.dk("2bulls","YsnGfP4rZ1IZ",10000,32)我很期待Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBP
摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信
有没有办法为Sinatra获取DjangoAdmin风格的网络管理员? 最佳答案 没用过,但通过谷歌很快就显示出来了:http://www.padrinorb.com/ 关于ruby-SinatraWeb管理员(如Django管理员),我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2855494/
我正在深入了解Jekyll,并希望将其用作通用前端开发平台,但遇到了Liquid模板语言的局限性,特别是它与Django模板的区别。我发现了liquid-inheritancegem,它添加了Django中最重要的Extends和Block语法。这篇博文进一步扩展了gem以适应Jekyll的文件系统:http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html问题是它似乎没有以与Django完全相同的方式实现block,这实际上使gem变得无用。为了便于理解,我有两个名为par
有没有类似于Celery的东西对于ruby?有没有人对rcelery有任何经验??它是生产的好选择吗?更新:我遇到了resque,这看起来像是我可以用于我的任务的东西。欢迎任何进一步的建议! 最佳答案 ruby中有很多队列选项。Sidekiq->https://github.com/mperham/sidekiqResque,你得到了链接延迟作业->http://blog.leetsoft.com/delayed_job/它们几乎都是一样的。因此,您只需要使用您更熟悉示例的那个即可。在我的项目中,我最终使用了Sidekiq,关于它的
我目前正在尝试在Rails和Django之间做出决定。目前我发现ruby更优雅,所以我考虑Django的唯一原因是管理面板..我没有任何经验,但我必须在截止日期前快速开发应用程序。Rails中是否有一种方法可以根据您的模型(如django中的管理面板)为您的所有CRUD操作生成一组(接近生产就绪的)View?(即它会查看您的模型并看到您有一个属于某个组的人,并在创建人员View上为该组生成一个下拉列表)?如果不是,那是获得所有CRUDView初稿的最快方法(无需手动编写)?谢谢,丹尼尔 最佳答案 有趣的工具http://acti
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion我一直在找工作。大多数公司都需要RoR或Django经验。我不懂任何一种语言。使用RoR的组织数量多于Django。但我更喜欢django因为python。你们的程序员/招聘人员建议我知道什么?
假设我们有那些Django模型:classBand(models.Model):name=models.CharField(max_length=256,default="EaglesofDeathMetal")classSong(models.Model):band=models.ForeignKey(Band)当使用admin管理这些模型时,band字段关联到由Django呈现为selecthtml元素的Widget。Django的管理员还在select旁边添加了一个绿色加号图标,单击它会打开一个弹出窗口,用户会在其中看到Form添加一个新的乐队。单击此弹出窗口中的save按钮时,
我的模板上有以下JQueryAjax请求,我想将其传递给我的DjangoView,functionloginUser(){$.ajax({type:"POST",url:"/login-user/",data:"title=ajaxcall",datatype:"json",error:function(data){alert('Error:'+data);}success:function(data){alert('OK!'+data.message+','+data.code);}});}我的DjangoView如下所示:deflogin_user(request):print"g
这个对我来说有点棘手。到目前为止,我已经求助于查询参数而不是{%url%}标记中的变量,但我只想问问它是否可行:我想在我的模板标签中包含一个JS变量。例如:...varfoo=$(this).attr('title');$('#bar').load("{%urlapp.views.viewfoo%}");...可以吗? 最佳答案 不可行。在评估Javascript时,HTML(和Javascript)已经呈现并提供给客户端。您需要一些其他方法,例如(如您所述)查询参数:varfoo=$(this).attr('title');$('