我写了一个小的Python应用程序作为守护进程运行.它利用线程和队列.
我正在寻找改变这个应用程序的一般方法,以便我可以在它运行时与它通信.大多数情况下,我希望能够监测其健康状况.
简而言之,我希望能够做到这样的事情:
python application.py start # launches the daemon
Run Code Online (Sandbox Code Playgroud)
后来,我希望能够出现并执行以下操作:
python application.py check_queue_size # return info from the daemonized process
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我在实现Django启发的语法时没有任何问题.我不知道该怎么做是将信号发送到守护进程(start),或者如何编写守护进程来处理和响应这些信号.
就像我上面说的那样,我正在寻找一般方法.我现在能看到的唯一一个就是告诉守护进程不断记录文件可能需要的所有内容,但我希望有一个不那么混乱的方法.
更新:哇,很多很棒的答案.非常感谢.我想我会看看Pyro和web.py/Werkzeug的方法,因为Twisted比我想要咬一点点多一点.我认为,下一个概念性的挑战是如何在不挂断它的情况下与我的工作线程进行交谈.
再次感谢.
我想编写一个python库来包装特定Web服务提供的REST风格的API.有没有人知道这些工作的任何好的学习资源,最好是针对中级Python程序员?
我想要一篇关于这个主题的好文章,但我会满足于很好,清晰的代码示例.
澄清:我要做的是编写一个Python客户端来与Web服务交互 - 构建HTTP请求和解析XML/JSON响应,这些都包含在Python对象中.
我对基于事件的编程很新(使用node.js).我相信有些东西我只是不喜欢它,因为有一个特殊的问题,我一次又一次地遇到.
简而言之,当问题似乎妨碍你时,这个问题正在处理异步性问题.在我的情况下,这通常表现在与第三方库一起工作时,第三方库在设计上是非阻塞的,并且提升了基于回调的API.
例如:现在我正在写一些大量使用mranney的node-redis库的东西.我的程序正在抓取RSS提要并将结果隐藏到redis中.我正在使用我认为是redis的常见策略:
feed:<feedId>:results:<timestamp>.feed:<feedId>:latest.
var redis = require("redis");
var client = redis.createClient();
var get_latest_results = function (feedId) {
client.get('feed:+ feedId + ':latest', function (err, res) {
var latest_reading_key = res.toString();
client.hgetall(latest_reading_key, function (err, res) {
var latest_reading = res;
});
});
// how do I specify a return value for this function?
}
放置return latest_reading在get_latest_results函数的底部失败,因为在函数准备退出之后才定义latest_reading .放置return latest_reading在hgetall调用中失败,因为它return引用了回调,并被忽略get_latest_results.
这只是我似乎不断写入的那种情况的一个例子.也许我正试图将方钉钉入圆孔,因为我不知道更好.似乎应该有一种解决这类问题的非黑客方式.
说我有以下型号:
class Image(models.Model):
image = models.ImageField(max_length=200, upload_to=file_home)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
class Article(models.Model):
text = models.TextField()
images = generic.GenericRelation(Image)
class BlogPost(models.Model):
text = models.TextField()
images = generic.GenericRelation(Image)
Run Code Online (Sandbox Code Playgroud)
找到所有至少附有一个Image的文章的处理器和内存最有效的方法是什么?
我这样做了:
Article.objects.filter(pk__in=Image.objects.filter(content_type=ContentType.objects.get_for_model(Article)).values_list('object_id', flat=True))
Run Code Online (Sandbox Code Playgroud)
哪个有效,但除了丑陋之外需要永远.
我怀疑使用原始SQL有一个更好的解决方案,但这超出了我的范围.对于它的价值,上面生成的SQL如下:
SELECT `issues_article`.`id`, `issues_article`.`text` FROM `issues_article` WHERE `issues_article`.`id` IN (SELECT U0.`object_id` FROM `uploads_image` U0 WHERE U0.`content_type_id` = 26 ) LIMIT 21
Run Code Online (Sandbox Code Playgroud)
编辑: czarchaic的建议有更好的语法,但更糟(更慢)的性能.他的查询生成的SQL如下所示:
SELECT DISTINCT `issues_article`.`id`, `issues_article`.`text`, COUNT(`uploads_image`.`id`) AS `num_images` FROM `issues_article` LEFT OUTER JOIN `uploads_image` ON (`issues_article`.`id` = `uploads_image`.`object_id`) GROUP BY `issues_article`.`id` …Run Code Online (Sandbox Code Playgroud) 于是就出现了许多像文章这样一个最近,结合光前端Web服务器使用时颂扬Django的静电发生器的美德.这对我来说很有意义.
但是,我得不到其他人报告的结果 - 每秒数千个请求 - 我不知道为什么会这样.
我正准备重新设计我的报纸网站.我现在在测试服务器上使用静态生成器.当我在特定的静态页面上运行Apache Bench时,我得到了相当悲惨的结果:
ab -c 10 -n 1000 http://journal.streamlister.com/news/
Concurrency Level: 10
Time taken for tests: 53.011 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 21281212 bytes
HTML transferred: 21067360 bytes
Requests per second: 18.86 [#/sec] (mean)
Time per request: 530.107 [ms] (mean)
Time per request: 53.011 [ms] (mean, across all concurrent requests)
Transfer rate: 392.04 [Kbytes/sec] received
Run Code Online (Sandbox Code Playgroud)
top在围攻开启时我正在服务器上观看,我可以看到它根本没有击中Apache或数据库服务器.事实上,它正在为缓存页面提供服务.Nginx正在运行,但它永远不会超过2%的内存使用量.CPU仍然闲置约95%.
我究竟做错了什么?我能以某种方式错误配置nginx吗?我的主配置文件粘贴在下面; 特定于此站点的包含几乎是静态生成器主页上的示例配置的副本.我在Slicehost 256k切片上运行Ubuntu 9.10.
user not_my_real_username;
worker_processes …Run Code Online (Sandbox Code Playgroud) 看起来pyephem 应该能够给我你在月球周期中所处位置的标准人类名称,给定日期——“上弦月”、“满月”、“上弦新月”、“渐亏凸月”等。
我说得对吗?
有谁知道这个问题的标准解决方案?