我有以下代码:
import logging
class A(object):
def __init__(self):
self._l = self._get_logger()
def _get_logger(self):
loglevel = logging.INFO
l = logging.getLogger(__name__)
l.setLevel(logging.INFO)
h = logging.StreamHandler()
f = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
h.setFormatter(f)
l.addHandler(h)
l.setLevel(loglevel)
return l
def p(self, msg):
self._l.info(msg)
for msg in ["hey", "there"]:
a = A()
a.p(msg)
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
2013-07-19 17:42:02,657 INFO hey
2013-07-19 17:42:02,657 INFO there
2013-07-19 17:42:02,657 INFO there
Run Code Online (Sandbox Code Playgroud)
为什么"那里"被打印两次?同样,如果我在循环中添加A类的另一个对象并打印一条消息,它将被打印三次.
文档说如果记录器的名称匹配,logging.getLogger()将始终返回相同的记录器实例.在这种情况下,名称确实匹配.它不应该返回相同的记录器实例吗?如果它实际上是这样做的,为什么消息会被多次打印?
所以我想知道什么是更好的方式(在堆栈增长和性能方面)以定期间隔递归调用函数?例如,假设我想每200毫秒读取一次文件内容.我有以下两种方法,并想知道它们是否有任何不同?
方法1:使用普通ols setTimeout而不使用process.nextTick
var fs = require('fs');
(function loop() {
// Print to time to indicate something is happening
console.log(new Date().toString());
// Read a 51MB file
fs.readFile('./testfile', function (err, data) {
if (err) console.log(err);
});
// Call the same function again
setTimeout(function () {
loop();
}, 200);
})();
Run Code Online (Sandbox Code Playgroud)
方法2:在setTimeout中调用process.nextTick
var fs = require('fs');
(function loop() {
// Print to time to indicate something is happening
console.log(new Date().toString());
// Read a 51MB file
fs.readFile('./testfile', function (err, data) {
if (err) console.log(err); …Run Code Online (Sandbox Code Playgroud) 我想了解提供倒计时 = xx 如何影响任务的调度。根据http://docs.celeryproject.org/en/latest/userguide/calling.html?highlight=countdown#eta-and-countdown,设置倒计时意味着任务至少需要 xx 秒才能执行。
我想知道的是它是如何实现的。当我们为任务提供倒计时值时,是将任务添加到队列中但没有工作人员拿起它,还是工作人员拿起任务但将其执行推迟到至少倒计时值到期?
在看了很多关于和弦回调未执行的文章并尝试了他们的解决方案之后,我仍然无法让它工作。事实上,由于某种原因,chord_unlock 方法也没有被执行。
芹菜.py
from __future__ import absolute_import
from celery import Celery
app = Celery('sophie',
broker='redis://localhost:6379/2',
backend='redis://localhost:6379/2',
include=['sophie.lib.chord_test'])
app.conf.update(
CELERY_ACCEPT_CONTENT=["json"],
CELERY_TASK_SERIALIZER="json",
CELERY_TRACK_STARTED=True,
CELERYD_PREFETCH_MULTIPLIER=1, # NO PREFETCHING OF TASKS
BROKER_TRANSPORT_OPTIONS = {
'priority_steps': [0, 1] # ALLOW ONLY 2 TASK PRIORITIES
}
)
if __name__ == '__main__':
app.start()
Run Code Online (Sandbox Code Playgroud)
和弦测试.py
from __future__ import absolute_import
from sophie.celery import app
from celery import chord
@app.task(name='sophie.lib.add')
def add(x, y):
return x + y
@app.task(name='sophie.lib.tsum')
def tsum(numbers):
return sum(numbers)
if __name__ == '__main__':
tasks = [add.s(100, 100), …Run Code Online (Sandbox Code Playgroud)