Python高级(5)—多进程、多线程的不确定性及守护与阻塞进程和线程join()方法使用

◎知识点

  1. 多进程执行的不确定性

  2. 多线程执行的不确定性

  3. 阻塞父进程的子进程之方法join()

  4. 阻塞父线程的子线程之方法join()

  5. 守护父进程的子进程

  6. 守护父线程的子线程


◎脚本练习

 多进程执行的不确定性

"""
    默认情况下,多个进程的执行顺序和时间都是不确定的,完全取决于操作系统的调度
"""

"""
from multiprocessing import Process, current_process
import time

def do_sth():
    for i in range(5):
        print('%s: %d' % (current_process().name, i))
        time.sleep(2)

if __name__ == '__main__':
    for i in range(3):
        Process(target=do_sth).start()

    do_sth()
"""

Python高级(5)—多进程、多线程的不确定性及守护与阻塞进程和线程join()方法使用


 多线程执行的不确定性

"""
    默认情况下,多个线程的执行顺序和时间都是不确定的,完全取决于操作系统的调度。
"""

"""
from threading import Thread, current_thread
import time

def do_sth():
    for i in range(5):
        print('%s: %d' % (current_thread().name, i))
        time.sleep(2)

if __name__ == '__main__':
    for i in range(3):
        Thread(target=do_sth).start()

    do_sth()
"""

Python高级(5)—多进程、多线程的不确定性及守护与阻塞进程和线程join()方法使用


 阻塞父进程的子进程之方法join()

"""
    在父进程中创建并启动子进程后,可以调用子进程的方法join(),这样,子进程会把父进程阻塞,
父进程会等子进程执行完之后再从被阻塞的地方继续执行。
    在调用方法join()时,可以指定参数timeout,从而指定子进程阻塞父进程的时间。
"""

"""
from multiprocessing import current_process, Process
import time

class MyProcess(Process):
    def run(self):
        print('子进程%d启动' % current_process().pid)
        time.sleep(2)
        print('子进程%d结束' % current_process().pid)

if __name__ == '__main__':
    print('父进程%d启动' % current_process().pid)

    mp = MyProcess()
    mp.start()

    # mp.join()
    mp.join(1)

    print('父进程%d结束' % current_process().pid)
"""


 阻塞父线程的子线程之方法join()

"""
    在父线程中创建并启动子线程后,可以调用子线程的方法join(),这样,子线程会把父线程阻塞,
父线程会等子线程执行完之后再从被阻塞的地方继续执行。
    在调用方法join()时,可以指定参数timeout,从而指定子线程阻塞父线程的时间。
"""

"""
from threading import current_thread, Thread
import time

class MyThread(Thread):
    def run(self):
        print('子线程%s启动' % current_thread().getName())
        time.sleep(2)
        print('子线程%s结束' % current_thread().getName())

if __name__ == '__main__':
    print('父线程%s开始' % current_thread().getName())

    mt = MyThread()
    mt.start()

    # mt.join()
    mt.join(1)

    print('父线程%s结束' % current_thread().getName())
"""


 守护父进程的子进程

"""
    可以在调用进程实例对象的方法start()之前将属性daemon的值设置为True,从而将进程设置为守护进程。
    守护进程是为了守护父进程而存在的子进程。当父进程结束时,守护进程就没有存在的意义了,因此,
守护进程会随着父进程的结束而立刻结束。
"""

"""
from multiprocessing import current_process, Process
import time

class MyProcess(Process):
    def run(self):
        print('子进程%d启动' % current_process().pid)
        time.sleep(2)
        print('子进程%d结束' % current_process().pid)

if __name__ == '__main__':
    print('父进程%d启动' % current_process().pid)

    mp = MyProcess()
    mp.daemon = True
    mp.start()

    time.sleep(1)

    print('父进程%d结束' % current_process().pid)
"""


 守护父线程的子线程

"""
    在创建线程实例对象时,可以将参数daemon指定为True,从而将创建的线程设置为守护线程。此外,
也可以在调用线程实例对象的方法start()之前调用线程实例对象的方法setDaemon(True)或
将属性daemon的值设置为True,从而将线程设置为守护线程。
    守护线程是为了守护父线程而存在的子线程。当父线程结束时,守护线程就没有存在的意义了,因此,
守护组进程会随着父线程的结束而立刻结束。
"""

from threading import current_thread, Thread
import time

class MyThread(Thread):
    def run(self):
        print('子线程%s启动' % current_thread().getName())
        time.sleep(2)
        print('子线程%s结束' % current_thread().getName())

if __name__ == '__main__':
    print('父线程%s开始' % current_thread().getName())

    mt = MyThread()
    mt.setDaemon(True)
    # mt.daemon = True
    mt.start()

    time.sleep(1)

    print('父线程%s结束' % current_thread().getName())


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_senior/join()_daemon.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5572.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注