Python 多处理帮助:启动循环

Python 多处理帮助:启动循环,python,multiprocessing,Python,Multiprocessing,我拥有的: Web应用程序可以做一些事情,运行在瓶子微框架上,这里是主要的 def run_server(): bottle.run(host=env.str('SRVRIP'), port=env.str('SRVRPORT'), debug=False) # Main if __name__ == '__main__': run_server() 我想补充的内容: 我想将此应用程序分为两个进程:第一个进程名为main\u service(),它只

我拥有的:
Web应用程序可以做一些事情,运行在瓶子微框架上,这里是主要的

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

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


我想补充的内容:
我想将此应用程序分为两个进程:第一个进程名为
main\u service()
,它只运行服务器,第二个进程名为
backup\u service()
,它必须定期进行数据库备份(每小时一次)



我所尝试的
首先,我尝试了
asyncio
模块,但失败惨重(尝试只是为了好玩和理解一些新东西)。 现在我面对的是
多处理
(撇开线程问题不谈,因为我不想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
如您所见
用户:如您所见
它要求输入
用户:它要求输入
但是备份服务()没有打印任何内容
用户:但是备份服务()没有打印任何内容

预期产量
过程14608
当我写作时
用户:当我写作时
备份
每秒钟
用户:每秒钟
备份服务()必须打印“备份” 用户:备份服务()必须打印“备份” 备份

有人能帮忙吗?

process.join()
永远不会进入第二个进程,因为
process.join()
只有在它所加入的进程终止时才会结束。在您的例子中,进程是一个无限循环,因此它永远不会终止,也永远不会将循环推进到下一个进程

通过使用
join()
的超时选项,您可以绕过这个问题,并看到其他进程的一些输出。或者,您可以将您的进程输出到不同的文件,并跟踪这些文件,以确认它们都在运行。

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


通过使用
join()
的超时选项,您可以绕过这个问题,并看到其他进程的一些输出。或者,您可以将流程输出到不同的文件,并跟踪这些文件以确认它们都在运行。

您将应用程序拆分为两个流程,但不知道在主流程中要做什么:为什么不只运行一个新流程(用于备份)在启动程序的主进程中保持web服务器循环运行

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


保持简单…

您将应用程序分为两个进程,但不知道在主进程中要做什么:为什么不只运行一个新进程(用于备份),并在启动程序的主进程中保持web服务器循环运行

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


保持简单…

谢谢,无论如何这样做我的“main_service()”从不打印idk Whysorry,我的代码中有一个错误:你应该只传递函数名而不传递()到目标进程。谢谢,无论如何这样做我的“main_service()”从不打印idk Whysorry,我的代码中有一个错误:您应该只将不带()的函数名传递给目标进程。
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)