我所拥有的:
运行某些操作的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
任何人都可以帮忙吗?
答案 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)
保持简单...