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)