Operating system 如何在os fork中保存线程?

Operating system 如何在os fork中保存线程?,operating-system,multiprocess,Operating System,Multiprocess,我想检查在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 pri

我想检查在
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)
#!/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
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)>
输出如下:

pre fork
post fork
post fork
1
1
<_MainProcess(Secondary, started)>
<_MainProcess(MainProcess, started)>
2
2
<_MainProcess(MainProcess, started)>
<_MainProcess(Secondary, started)>
pre-fork
邮政叉
邮政叉
1.
1.
2.
2.
总结

  • 似乎当我们在
    os.fork
    之后启动线程时,一切都会正常,父进程和子进程都会运行线程
  • 当我们在
    os.fork
    之前启动线程时,根据输出,该线程似乎没有出现
    os.fork
    ,即它没有在子进程中执行

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

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

  • os.fork
    仅在写入时进行复制
  • 父进程和子进程都有相同的代码
  • 然而,如果我们在
    os.fork
    之前启动一个线程,那么子进程就没有
    start
    逻辑
  • 所以,如果我们想在子进程中存在一个线程,那么我们只能在拥有
    os.fork
    it之后启动它
:)

注意:这与。