测试人社区

【求助】子进程时间为4s,主进程设置slepp4s,为什么有时候子进程可以执行完,有时候子进程不能执行完呢?

知识模块:python多线程
问题描述:子进程时间为4s,主进程设置slepp 4s,为什么有时候子进程可以执行完,有时候子进程不能执行完呢?
import _thread
import logging # python自带的模块
from time import sleep, ctime

logging.basicConfig(level=logging.INFO)#基本初始化,配置参数,level=日志的输出等级配置为info级别,所有的info级别的日志都会进行打印输出
def loop0():
logging.info(“start loop0 at” + ctime()) #ctime()是python自带的时间函数
sleep(4)
logging.info(“end loop0 at” + ctime())

def loop1():
logging.info(“start loop1 at” + ctime()) #ctime()是python自带的时间函数
sleep(2)
logging.info(“end loop1 at” + ctime())

#_thread改造
def main():
logging.info(“start all at” + ctime())
_thread.start_new_thread(loop0,())#第一个参数是函数名,不带(),第二个参数是传参
_thread.start_new_thread(loop1,())
sleep(4)
logging.info(“end all at” + ctime())

if name == ‘main’:
main()



从图上可以看出,实际上子线程比主线程要慢了一点,导致没能赶在主线程结束前运行完毕

老师,我还是不明白呢
这个例子只解释了子进程没执行完的情况,是因为子进程比主进程慢。
可是如果多次运行,会发现,有时子进程可以在4s内执行完的。
如果子进程一直比主进程慢的话,为什么会存在子进程、主进程都执行完毕的情况呢?

因为子线程的启动时间和主线程的运行时间都非常短,所以可能会有缓存等因素影响导致有的时候子线程的启动时间要比主线程执行中间代码的时间短,于是就抢在主线程之前开始进入for循环,导致结束的比主线程要早。
但是,要注意的是他们并不是主进程和子进程,而是线程,因为_thread是一个并发而不是并行,本质上都是在一个进程上运行的,实质上同一时间点还是只有一个任务在进行处理,所以一定会有先后之分。如果真的想并行多进程的话可以看看multiprocessing

明白了,谢谢老师~