celery python线程与函数导入

时间:2015-09-24 15:26:54

标签: python multithreading celery

我在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)

0 个答案:

没有答案