多处理帮助:启动循环

时间:2019-03-06 16:37:36

标签: python multiprocessing

我所拥有的:
运行某些操作的Web应用程序,运行在Bottle微型框架上,这是Main

def run_server():
    bottle.run(host=env.str('SRVRIP'), port=env.str('SRVRPORT'), debug=False)

    # Main
    if __name__ == '__main__':
        run_server()



我要添加的内容:
我想将此应用分为2个过程:第一个叫main_service(),它仅运行服务器,第二个叫backup_service(),它必须进行定期Db备份(每小时一次)



我尝试过的
首先,我尝试使用asyncio模块,但失败了(尝试只是为了娱乐和了解新事物)。 现在我要面对multiprocessing(不考虑线程原因,我不想让GIL麻烦),但是我不明白如何使其工作,这是我的代码:

import multiprocessing
import time
import os


def main_service():
    print(f'Process {os.getpid()}')

    while(True):
        sentence=input()
        print(f'USER: {sentence}')


def backup_service():
    print(f'Process {os.getpgid()}')

    while(True):
        print('BACKUP')
        time.sleep(1)


if __name__ == "__main__":
    processes = []

    t = multiprocessing.Process(target=main_service())
    processes.append(t)
    t.start()

    t = multiprocessing.Process(target=backup_service())
    processes.append(t)
    t.start()

    for process in processes:
        process.join()

    print('Done')

如果运行

进程14608
如您所见
使用者:您可以看到
要求输入
USER:要求输入
但是backup_service()没有打印任何内容
USER:但是backup_service()没有打印任何内容

预期产量

进程14608
在写的时候
使用者:我正在写作
备份
每秒
使用者:每秒
backup_service()必须打印“ BACKUP” USER:backup_service()必须打印“ BACKUP” BACKUP

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

process.join()永远不会进入第二个进程,因为process.join()仅在其加入的进程终止时结束。在您的情况下,该进程是一个无限循环,因此它永远不会终止,也永远不会将循环推进到下一个进程。

通过使用join()的超时选项,您可以解决此问题并从其他进程中看到一些输出。另外,您可以将进程输出到不同的文件,并尾随这些文件以确认它们都在运行。

答案 1 :(得分:1)

您将应用程序分为2个进程,但随后又不知道在主要进程中要做什么:为什么不只运行一个新进程(用于备份),而保持Web服务器循环在其中运行启动程序的主要过程?

类似的东西应该可以工作(未经测试):

import multiprocessing
import time
import os

def backup_service():
    print(f'Process {os.getpgid()}')

    while(True):
        print('BACKUP')
        time.sleep(1)


if __name__ == "__main__":
    t = multiprocessing.Process(target=backup_service)
    t.daemon = True
    t.start()
    bottle.run(host=env.str('SRVRIP'), port=env.str('SRVRPORT'), debug=False)

保持简单...