是)我有的: 做一些事情的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:正如您所看到的 它要求输入 USER:它要求输入 但是backup_service()不打印任何东西 USER:但是backup_service()没有打印任何内容
预期产出
过程14608 在我写作的时候 用户:我正在写作 BACKUP 每一秒 用户:每一秒 backup_service()必须打印'BACKUP'USER:backup_service()必须打印'BACKUP'BACKUP
有人可以帮忙吗?
您在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)
把事情简单化...
process.join()
永远不会进入第二个过程因为process.join()
只在它加入的过程终止时结束。在您的情况下,该过程是一个无限循环,因此它永远不会终止,它永远不会将循环推进到下一个过程。
您可以通过使用join()
的超时选项来解决此问题并查看其他进程的输出。或者,您可以将流程输出到不同的文件并拖尾这些文件以确认它们都在运行。