我一直在阅读python 3中的asyncio模块,更广泛地讲述python中的协同程序,我无法得到使asyncio成为如此优秀工具的原因.我觉得你可以用协同程序做所有事情,你可以通过使用基于多处理模块的任务队列(例如芹菜)来做得更好.是否存在协同程序优于任务队列的用例?
我有一个表(A 列,B 列)上有一个索引。我正在运行一个如下所示的查询:
SELECT * FROM table WHERE (A, B) IN ((a_1, b_1), (a_2, b_2), ..., (a_5000, b_5000))
Run Code Online (Sandbox Code Playgroud)
这个查询很慢!该计划如下所示:
Bitmap Heap Scan on table
Recheck Cond: (((A = a_1) AND (B = b_1)) OR ((A = a_2) AND (B = b_2)) OR ...
-> BitmapOr
-> Bitmap Index Scan on idx
Index Cond: ((A = a_1) AND (B = b_1))
-> Bitmap Index Scan on idx
Index Cond: ((A = a_2) AND (B = b_2))
...(5000 other Bitmax Index Scan) …Run Code Online (Sandbox Code Playgroud) 我已经安装了Celery,并且正在尝试使用Celery First Steps Doc对其进行测试。
我尝试将Redis和RabbitMQ都用作代理和后端,但无法获得结果:
result.get(timeout = 10)
Run Code Online (Sandbox Code Playgroud)
每次,我都会收到此错误:
Traceback (most recent call last):
File "<input>", line 11, in <module>
File "/home/mehdi/.virtualenvs/python3/lib/python3.4/site-packages/celery/result.py", line 169, in get
no_ack=no_ack,
File "/home/mehdi/.virtualenvs/python3/lib/python3.4/site-packages/celery/backends/base.py", line 225, in wait_for
raise TimeoutError('The operation timed out.')
celery.exceptions.TimeoutError: The operation timed out.
Run Code Online (Sandbox Code Playgroud)
经纪人部分似乎工作得很好:当我运行这段代码时
from celery import Celery
app = Celery('tasks', backend='redis://localhost/', broker='amqp://')
@app.task
def add(x, y):
return x + y
result = add.delay(4,4)
Run Code Online (Sandbox Code Playgroud)
我得到了(按预期)
[2015-08-04 12:05:44,910:INFO / MainProcess]收到的任务:tasks.add [741160b8-cb7b-4e63-93c3-f5e43f8f8a02]
[2015-08-04 12:05:44,911:INFO / MainProcess]任务task.add [741160b8-cb7b-4e63-93c3-f5e43f8f8a02]成功0.0004287530000510742s:8
PS:我正在使用Xubuntu 64bit
编辑: …
在python日志教程中,有一个带有两个python脚本的例子:myapp.py和mylib.py
代码是:
# myapp.py
import logging
import mylib
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logging.info('Started')
mylib.do_something()
logging.info('Finished')
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
和
# mylib.py
import logging
def do_something():
logging.info('Doing something')
Run Code Online (Sandbox Code Playgroud)
我没有得到的是如何使用basicConfigin myapp.py更改日志记录行为mylib.py.
我认为在Python中,当您在两个不同的脚本中导入相同的模块时,它们完全断开连接,因为第一个myapp.logging和第二个完成mylib.logging.
编辑:
我将mylib.py代码更改为
# mylib.py
import logging
def do_something():
logging.warning('Doing something')
do_something()
Run Code Online (Sandbox Code Playgroud)
当我运行myapp.py时,日志现在在控制台中打印,不再出现在日志文件中.怎么可能?