oshipka/oshipka/worker.py

51 lines
1.3 KiB
Python

import os
import sys
from celery import Celery
from celery.signals import task_prerun
from config import TASKS_IN_DIR, TASKS_PROC_DIR, TASKS_BUF_DIR
from oshipka.persistance import db
worker_app = Celery(__name__)
worker_app.conf.update({
'broker_url': 'filesystem://',
'result_backend': "file://{}".format(TASKS_PROC_DIR),
'broker_transport_options': {
'data_folder_in': TASKS_IN_DIR,
'data_folder_out': TASKS_IN_DIR,
'data_folder_processed': TASKS_PROC_DIR,
},
'imports': ('tasks',),
'result_persistent': True,
'task_serializer': 'json',
'result_serializer': 'json',
'accept_content': ['json']})
class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def writelines(self, datas):
self.stream.writelines(datas)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)
@task_prerun.connect
def before_task(task_id=None, task=None, *args, **kwargs):
from oshipka import app
sys.stdout = Unbuffered(open(os.path.join(TASKS_BUF_DIR, task_id), 'w'))
sys.stderr = Unbuffered(open(os.path.join(TASKS_BUF_DIR, task_id), 'w'))
db.init_app(app)
app.app_context().push()
app.test_request_context().push()