我拥有的:
在瓶子式框架上运行某些事情的Web应用程序,这是主要
def run_server():
bottle.run(host=env.str('SRVRIP'), port=env.str('SRVRPORT'), debug=False)
# Main
if __name__ == '__main__':
run_server()
我要添加的内容:
我想将此应用程序分为两个进程:首先称为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
如您所见
用户:您可以看到
它要求输入
用户:它要求输入
但是backup_service()没有打印任何东西
用户:但是backup_service()没有打印任何东西
预期输出
过程14608
当我写作
用户:当我写作
时备份
每一秒
用户:每一秒
backup_service()必须打印"备份"用户:backup_service()必须打印"备份"备份
任何人可以帮忙吗?
您将应用程序分为两个过程中,但是您不知道在主过程中该怎么做:为什么不只是仅运行一个新过程(用于备份)和您将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()
的超时选项来查看另一个过程中的一些输出。另外,您可以将流程输出到不同的文件并拖延这些文件以确认它们都在运行。