如何在os fork中保留线程?

时间:2016-02-24 07:56:49

标签: operating-system multiprocess

我想检查一下UITabBarController期间是否会保留线程。 这是线程在os.fork之前启动的。

os.fork

该计划的输出:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import multiprocessing
from threading import Timer
import time

i = [0]

def work():
    while True:
        time.sleep(1)
        i[0] += 1
        print i[0]
        print multiprocessing.current_process()


if __name__ == '__main__':
    task = Timer(1, work)
    task.daemon = True
    task.start()
    time.sleep(2)
    print 'pre fork'
    if os.fork():
        # parent process
    else:
        # child process
        multiprocessing.current_process().name = "Secondary"
    time.sleep(2)
    print 'post fork'
    time.sleep(1000)

=============================================== ===========================

这是pre fork 1 <_MainProcess(MainProcess, started)> 2 <_MainProcess(MainProcess, started)> post fork post fork 3 <_MainProcess(MainProcess, started)> 4 <_MainProcess(MainProcess, started)> 5 <_MainProcess(MainProcess, started)> 6 <_MainProcess(MainProcess, started)> 7 <_MainProcess(MainProcess, started)> 之后线程的启动。

os.fork

输出如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import multiprocessing
from threading import Timer
import time

i = [0]

def work():
    while True:
        time.sleep(1)
        i[0] += 1
        print i[0]
        print multiprocessing.current_process()


if __name__ == '__main__':
    task = Timer(1, work)
    task.daemon = True
    time.sleep(2)
    print 'pre fork'
    if os.fork():
        # parent process
        task.start()
    else:
        # sub process
        multiprocessing.current_process().name = "Secondary"
        task.start()
    time.sleep(2)
    print 'post fork'
    time.sleep(1000)

摘要

  • 似乎当我们在pre fork post fork post fork 1 1 <_MainProcess(Secondary, started)> <_MainProcess(MainProcess, started)> 2 2 <_MainProcess(MainProcess, started)> <_MainProcess(Secondary, started)> 之后启动线程时,每个东西都会正常,父进程和子进程都将运行该线程。
  • 当我们在os.fork之前启动线程时,那么根据输出,似乎线程没有提出os.fork,即它不会在子进程中执行。

问题是这应该如何发生以及它是什么原因。

1 个答案:

答案 0 :(得分:0)

突然,我想出了一个解释,答案是不,在os.fork 期间不会保留主题。

  • os.fork只进行写时复制。
  • 父进程和子进程都具有相同的代码。
  • 但是,如果我们在os.fork之前启动一个线程,那么子进程没有start逻辑。
  • 因此,如果我们想在子进程中存在一个线程,那么我们只能在os.fork之后启动它。

:)

注意:这与gunicorn --preload argument类似。