我在python中工作,最初使用某人的代码来使用mapnik线程化并渲染地图。我已经尝试将其放入烧瓶API中,芹菜作为后端。
最初: https://gist.github.com/Thetoxicarcade/57777a6714cb6fecaacf
"添加api": https://gist.github.com/Thetoxicarcade/079cf03a3f3a061134f2
(是的,我会编辑它以使其更短更好)
一般来说:
烧瓶 - >搜索(参数) - > runCelery(params) - > returnOkay 芹菜工人(gimme params) - > fork一堆线程,渲染那个地方
*我可能只是把它重写成十亿个芹菜任务?
除了runCelery中的所有内容都在黑暗中。
工作人员任务本身:
"""background working map algorithm"""
# I have no clue with these celery declarations.
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
CELERY_ALWAYS_EAGER = True
worker = Celery('tasks', backend='rpc://', broker='redis://localhost')
@worker.task(name="Renderer")#bind=True
def async_render(key,minz,maxz,fake):
from celery.utils.log import get_task_logger
logs = logging.getLogger('brettapi')
file = logging.FileHandler('/home/aristatek/log{}'.format(key))
style = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
file.setFormatter(style)
logs.addHandler(file)
logs.setLevel(logging.DEBUG)
logs.debug('HELLO WORLD')
logs.debug('I AM {}'.format(key))
#osm file
home = os.environ['HOME']
tiledir = home + "/mapnik/mapnik/osm.xml"
#grab minz/maxz
if minz is None: minz = 6
if maxz is None: maxz = 17
name=reverseKey(key)
bounds=makeBorder(key)
file = home + "/mapnik/mapnik/tiles/" + name + "/"
print key,minz,maxz,fake,file, tiledir, name
print bounds
# polygons are defined by lowercase, spaceless name strings. (or they were.)
if fake is not True:
bbox = (-180, -90, 180, 90)
render_tiles(bbox, tiledir, file, 0, 5, "World")
render_tiles(bounds, tiledir, file, minz, maxz, name)
return "Finished"
显然,我试图让这些芹菜实例用日志或处理信息做出反应,他们拒绝这样做,这使得调试它们非常困难。
我开始了一个芹菜工人,并且能够开始芹菜花。我似乎无法将任务排队,看不到任何事情发生。 :/
部分原因可能是我没有导入函数,但即使使用pdb也没有用,因为芹菜对象的神秘主义并不服从我扔给他们的任何东西。
这是一个模糊的问题,因为我无论如何都很难理解。 "阅读文档"芹菜的页面尽量模糊。它们是指芹菜中的特性或功能或变量吗?在工人内部?
我想知道一种让芹菜回应的方法,这很有意义,因为这意味着我正朝着正确的方向前进。
任何帮助都将不胜感激。
编辑 -
从大多数情况来看,声明的名称必须是他们自己的:
def things(key):
thread_lots(key)
worker = Celery()
@worker.task(name='ThisTask')
def ThisTask(key):
from testme import things
things(key)
webserve = Flask()
@webserve.route('/bla')
def bla(key):
ThisTask.apply_async((params), task_id=key)