【Python】论如何使用Python派生一个独立进程

Python使用subprocess派生一个独立线程,这种属于小众场景,但是有时候很有用

背景

PyOne的后台管理中,经常需要使用subprocess开启一个进程运行任务,比如更新列表的功能,还有离线下载的功能,都会开启新进程运行子任务。

但是寻常方式开启的子任务,往往会随着网站重启而中断,因为子任务会随着父任务的结束而结束,因此需要寻找一种可以派生独立进程的方法。

解决方案

前提:这里的解决方案仅限于Linux,windows下无效。

这里先举个小例子:我们先建一个main.py脚本,作为我们的主线程,内容如下:

#-*- coding=utf-8 -*-
import subprocess
import threading
import time

def run():
    cmd='python child.py'
    subprocess.Popen(cmd,shell=True)

def main():
    t=threading.Thread(target=run)
    t.start()
    for i in range(100):
        time.sleep(1)

if __name__=='__main__':
    main()

然后再建一个child.py脚本,内容如下:

#-*- coding=utf-8 -*-
import time

for i in range(100):
    with open('test.txt','a') as f:
        f.write(str(i)+'\n')
    time.sleep(1)

我们允许main.py脚本的话,就会调用child.py,然后child.py会自动在当前目录创建一个test.txt文本,然后追加文本,如果我们在运行main.py的时候提前中止,那么child.py也会终止

那么,怎么操作,才能__使main.py脚本中止的情况下,child.py继续运行呢__?

答案就是:使用nohup!

我们将main.py的内容改成这样:

#-*- coding=utf-8 -*-
import subprocess
import threading
import time

def run():
    cmd='nohup python child.py &'
    subprocess.Popen(cmd,shell=True)

def main():
    t=threading.Thread(target=run)
    t.start()
    for i in range(100):
        time.sleep(1)

if __name__=='__main__':
    main()

然后再试着提前终止main.py看看

效果达到啦!

代码

https://github.com/abbeyokgo/nohup

本文作者:Abbey

本文链接:https://www.abbeyok.com/archives/323

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

【曝光】一个无耻的程序员可以多无耻?... <<
0 条评论

请先登陆注册

已登录,注销 取消