我正在使用Celery 3.1.16经纪人(运行RabbitMQ)和多名芹菜工人与celeryd通过主管守护.问题在于任务更新.当我更新我的tasks.py文件时,芹菜工作者运行旧代码.
芹菜发射命令:
/home/my_project/bin/celery -B --autoreload --app=my_app.celery:app worker --loglevel=INFO
Run Code Online (Sandbox Code Playgroud)
我在django settings.py中包含任务文件:
CELERY_IMPORTS = [
'my_app.tasks'
]
Run Code Online (Sandbox Code Playgroud)
pyinotify安装并工作(我猜是这样),芹菜日志的一部分:
[2014-12-16 20:56:00,016: INFO/MainProcess] Task my_app.tasks.periodic_update_task_statistic[175c2557-7c07-43c3-ac70-f4e115344134] succeeded in 0.00816309102811s: 'ok!'
[2014-12-16 20:56:11,157: INFO/MainProcess] Detected modified modules: ['my_app.tasks']
[2014-12-16 20:57:00,001: INFO/Beat] Scheduler: Sending due task my_app.tasks.periodic_update_task_statistic (my_app.tasks.periodic_update_task_statistic)
[2014-12-16 20:57:00,007: INFO/MainProcess] Received task: my_app.tasks.periodic_update_task_statistic[f22998a9-dcb4-4c29-8086-86dd6e57eae1]
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:如果修改了celery更新并应用新任务代码?
我正在使用pyinotify来查看在其中创建文件的文件夹.当创建某些文件时,我想移动它们.问题是,一旦创建文件(显然),我的程序就会尝试移动它,甚至在它完全写入磁盘之前.
有没有办法使pyinotify等到一个文件完全写入磁盘,然后通知我它已被创建?还是有任何简单的方法,在我收到通知后,让python等待移动它直到它完成写入?
我想Pyinotify看一个模板目录,它有子文件夹,但我收到这个错误:
DIRECTORY /home/project/templates
[Pyinotify ERROR] add_watch: cannot watch /home/project/templates WD=-1
[Pyinotify ERROR] add_watch: cannot watch /home/project/templates/dir1 WD=-1
[Pyinotify ERROR] add_watch: cannot watch /home/project/templates/dir2 WD=-1
Waiting for stuff to happen...
Run Code Online (Sandbox Code Playgroud)
我找到了诸如使用unicode目录名或使用其他使用inotify的程序的答案,但每个程序都过于具体.
什么一般导致这个错误?
我必须观察给出的任何输入或对文件中的当前内容所做的任何更改,在进行任何修改时我需要运行位于同一文件夹中的python程序.
我尽力了解,但我无法取得任何好成绩.如果有人能帮我解决这个问题,那将会有很大的帮助.
谢谢.. :)
我按照官方文档,安装了virtualenv和flask,然后python hello.py
却出现了问题:
* Running on http://127.0.0.1:5000/
* Restarting with reloader: inotify events
Traceback (most recent call last):
File "hello.py", line 9, in <module>
app.run(debug=True)
File "/home/aa/prj/env/lib/python2.7/site-packages/Flask-0.7.2-py2.7.egg/flask/app.py", line 553, in run
return run_simple(host, port, self, **options)
File "/home/aa/prj/env/lib/python2.7/site-packages/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 609, in run_simple
run_with_reloader(inner, extra_files, reloader_interval)
File "/home/aa/prj/env/lib/python2.7/site-packages/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 528, in run_with_reloader
reloader_loop(extra_files, interval)
File "/home/aa/prj/env/lib/python2.7/site-packages/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 436, in reloader_loop
reloader(fnames, interval=interval)
File "/home/aa/prj/env/lib/python2.7/site-packages/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 464, in _reloader_inotify
mask = reduce(lambda m, a: m | getattr(EventsCodes, a), mask, 0)
File …Run Code Online (Sandbox Code Playgroud) 我遇到以下情况:
稍微修改了一下之后,我注意到它在调试时运行良好。我在读取文件的行上设置了一个断点,从而增加了一点延迟。之后 - 文件被读取并且更改就在那里。
因此,添加 atime.sleep(1)或以其他方式延迟执行似乎可以解决问题。否则我会收到一个过早的 IN_CLOSE_WRITE 事件。
我想知道该事件是在提交更改并关闭文件之后还是在此之前触发。IN_CLOSE_WRITE 之后似乎没有其他相关事件。同时,文档有点棘手:
使用 IN_CLOSE_WRITE 因为如果发出,则相应文件上的所有更改都会安全地写入文件中
我提交了关于常见问题解答中措辞的错误报告,但与此同时,我想就此事获得一些额外的意见。这是应该发生的吗?什么是“道德正确”的解决方法?
所有这些都发生在 Linux Mint 15 x64 上。
描述
通常,如果更改python代码意味着,则需要重新启动服务器才能应用新更改.
如果--auto-reload参数已启用,则表示您无需重新启动服务器.它可以自动重新加载python文件和xml文件,而无需重新启动服务器.它需要pyinotify.它是一个用于监视文件系统更改的Python模块.
以前的问题
我收到了错误:
ERROR ? pyinotify: add_watch: cannot watch /home/user/.local/share/Odoo/addons/8.0 WD=-1, Errno=No space left on device (ENOSPC)
Run Code Online (Sandbox Code Playgroud)
但我按照这个链接的建议,现在我不再得到这个错误:
sysctl -n -w fs.inotify.max_user_watches=16384
Run Code Online (Sandbox Code Playgroud)
在此之后我在服务器日志中得到了这个:
openerp.service.server: Watching addons folder /opt/odoo_8/src/linked-addons
openerp.service.server: AutoReload watcher running
Run Code Online (Sandbox Code Playgroud)
这意味着它正常工作.事实上,我用一个物理插件路径测试它,它工作.
当前的问题
我的所有模块都有几个文件夹,但我只使用一个插件路径:/opt/odoo_8/src/linked-addons.此文件夹包含我正在使用的模块的所有链接.当我运行Odoo时,所有模块都运行良好.
但问题是pyinotify无法检查链接之外的文件,也不能很好地重新加载文件.我应该怎么做才能解决这个问题?pyinotify有没有办法识别链接的内容?
PD:我不想改变我在Odoo中管理模块文件夹的方式.
我正在使用pyinotify跟踪文件更改并尝试重载此修改文件所在的模块.但不幸的是,不是模块可能没有超载,我看不到变化.
import sys
import asyncio
import pyinotify
import importlib
from aiohttp import web
from aa.aa import m_aa
class EventHandler(pyinotify.ProcessEvent):
def my_init(self, loop=None):
self.loop = loop if loop else asyncio.get_event_loop()
def process_IN_MODIFY(self, event):
pathname = event.pathname
name = event.name
if name.endswith('.py'):
for module in sys.modules.values():
if hasattr(module, '__file__'):
if module.__file__ == pathname:
importlib.reload(module)
def inotify_start(loop):
wm = pyinotify.WatchManager()
wm.add_watch('/home/test', pyinotify.ALL_EVENTS, rec=True)
handler = EventHandler( loop=loop )
pyinotify.AsyncioNotifier(wm, loop, default_proc_fun=handler)
async def init(loop):
app = web.Application()
app.router.add_route('GET', '/', m_aa)
handler …Run Code Online (Sandbox Code Playgroud) 对于大文件或慢速连接,复制文件可能需要一些时间.
使用pyinotify,我一直在关注IN_CREATE事件代码.但这似乎发生在文件传输的开始.我需要知道文件什么时候被完全复制 - 如果文件只有一半那么它就没什么用了.
文件传输完成并完成后,会触发什么inotify事件?
我正在使用pyinotify将文件从源目录镜像到目标目录.当我手动执行时,我的代码似乎正常工作,但我无法获得准确的单元测试结果.我认为问题归结为:
有没有人成功进行pyinotify单元测试?
我有pserve --reload可以处理任何python更改,但是当我更改模板时我仍然需要手动重新加载.
我创建了这个监视模板文件夹的小脚本以进行任何更改,但是重新加载pserve的命令是什么?如果我需要从我的Pyramids项目中调用一个pserve方法,比如在init .py或者其他什么东西,我会调用什么方法来重新加载pserve?
#!/usr/bin/env python
import sys
import pyinotify
from subprocess import call
import time
wm = pyinotify.WatchManager()
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MODIFY
class EventHandler(pyinotify.ProcessEvent):
def process_IN_MODIFY(self, event):
print "Modified: ", event.pathname
# This is where my reload call would go...
# call(["pserve", "reload"])
handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch("/path/to/my/pyramid/templates/", mask, rec=True, auto_add=True)
notifier.loop()
Run Code Online (Sandbox Code Playgroud) pyinotify ×11
python ×9
inotify ×4
aiohttp ×1
celery ×1
celerybeat ×1
django ×1
file ×1
flask ×1
linux ×1
odoo ×1
odoo-8 ×1
pyramid ×1
python-2.7 ×1
python-3.x ×1
unit-testing ×1
watch ×1