1

我让 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 脚本在 Python shell 中使用tasks.run_cli.apply(). 那么为什么 Celery Daemon 不执行这些任务呢?

预警:我对 Python 和 Celery 还很陌生,而且我的 Linux 技能不完整,所以如果有明显的问题,我深表歉意。任何帮助深表感谢。

4

1 回答 1

1

为了结束轮询,Ruby 脚本必须向 Python 脚本发送一个非零信号,否则该过程完成并且 Python 继续轮询而不接收数据。也可以在 else 条件下跳出循环,因为错误的响应process.stdout.readline()表明(我怀疑)脚本的处理已经完成。

于 2015-12-14T22:30:04.477 回答