在运行Python Celery作为守护进程时无法执行Ruby脚本

时间:2015-10-05 00:22:57

标签: ruby linux celery daemon python-3.5

我将Python Celery作为守护进程运行,Celerybeat在Amazon Linux机器上执行任务。当我运行我的测试任务时,它完成没有任何意外。

@app.task
def test():
    print("Testing 123")
    return 0

然而,当我尝试使用Python的subprocess模块启动Ruby脚本时,它会轮询几次,然后退出并返回1

@app.task
def run_cli():
    try:
        process = subprocess.Popen([filepath, "run"], stdout=subprocess.PIPE)

        while not process.poll():
            data = process.stdout.readline()
            if data:
                sys.stdout.write("Polling: " + data.decode("utf-8"))
            else:
                sys.stdout.write("Polling: No Data.")

        return process.wait()
    except Exception as e:
        print(e)

我已经确认Ruby脚本在使用tasks.run_cli.apply()的Python shell中由Celery worker执行时运行得很干净。那么为什么Celery Daemon不能执行这项任务呢?

预警:我对Python& Celery和我的Linux技能都不完整,所以如果它显而易见,我会道歉。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

对于轮询结束,Ruby脚本必须将非零信号发送回Python脚本,否则进程完成,Python继续轮询而不接收数据。因为对process.stdout.readline()的错误响应表明(我怀疑)脚本的处理已经完成,所以也可以在else条件中突破循环。