介绍
这篇文章主要讲解了python在线程中处理主进程和子线程关系的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
之前用python的多线程,总是处理不好进程和线程之间的关系。后来发现了加入和setDaemon函数,才终于弄明白。下面总结一下。
1。使用加入函数后,主进程会在调用加入的地方等待子线程结束,然后才接着往下执行。
加入使用实例如下:
进口时间 进口随机 进口线程 类人员(threading.Thread): def __init__(自我): threading.Thread.__init__(自我) def运行(自我): t=random.randint (10) time . sleep (t) 打印“,这是“+ self.getName() +“,我睡觉% d第二!”% (t) 啧啧=[] 因为我在xrange (0 5): time . sleep (0.1) 线程=工人() thread.start () tsk.append(线程) 的tt啧啧: tt.join () 打印“,这是主线程结束!”
运行结果如下:
# python testjoin.py 这是Thread-3;我睡2秒。 这是线程1;我睡4秒。 这是线程2;我睡眠7秒。 这是Thread-4;我睡7秒。 这是Thread-5;我睡7秒。 这是主线程的结束。
这里创建了5个子线程,每个线程随机等待1 - 10秒后打印退出;主线程分别等待5个子线程结束。最后结果是先显示各个子线程,再显示主进程的结果。
2。如果使用的setDaemon函数,则与加入相反,主进程结束的时候不会等待子线程。
setDaemon函数使用实例:
进口时间 进口随机 进口线程 类人员(threading.Thread): def __init__(自我): threading.Thread.__init__(自我) def运行(自我): t=random.randint (10) time . sleep (t) 打印“,这是“+ self.getName() +“,我睡觉% d第二!”% (t) 啧啧=[] 因为我在xrange (0 5): time . sleep (0.1) 线程=工人() thread.setDaemon(真正的) thread.start () tsk.append(线程) 打印“,这是主线程结束!”
这里设置主进程为守护进程,当主进程结束的时候,子线程被中止
运行结果如下:
# python testsetDaemon。py
引用>
这是主线程的结束。3,如果没有使用加入和setDaemon函数,则主进程在创建子线程后,直接运行后面的代码,主程序一直挂起,直到子线程结束才能结束。
进口时间 进口随机 进口线程 类人员(threading.Thread): def __init__(自我): threading.Thread.__init__(自我) def运行(自我): t=random.randint (10) time . sleep (t) 打印“,这是“+ self.getName() +“,我睡觉% d第二!”% (t) 啧啧=[] 因为我在xrange (0 5): time . sleep (0.1) 线程=工人() thread.start () tsk.append(线程) 打印“,这是主线程结束!”运行结果如下:
# python testthread.py 这是主线程的结束。 这是Thread-4;我睡1秒。 这是Thread-3;我睡7秒。 这是Thread-5;我睡7秒。 这是线程1;我睡10秒。 这是线程2,我睡眠10秒。<强> Python对进程和线程比强>
原因:进程和线程的差距(方向不同,之针对这个实例)
#=utf - 8编码 导入日志 进口多处理 进口操作系统 导入的时间 从线程进口线程 logging.basicConfig (=logging.INFO水平, 格式=? (asctime)【% d(流程)】% (processName) %(消息)s" ) def func(我): # logging.info (f # 39;子:{os.getpid()},{我}\ t & # 39;) 返回f # 39;子:{os.getpid()},{我}\ t & # 39; def主要(ctx): start01=time.time () ts=[线程(目标=函数,参数=(我)我的范围(100)) [t.start ts (t)) [t.join ts (t)) ——start01 end01=time.time () logging.info (f"线程花费的时间:{end01}秒“) start02=time.time () (ctx ps=9?目标=函数,参数=(我)我的范围(100)) [p.start p在ps) () [p.join p在ps) () ——start02 end02=time.time () logging.info (f"进程花费的时间:{end02}秒“) if __name__==& # 39; __main__ # 39;: # windows启动方式 multiprocessing.set_start_method(& # 39;产卵# 39;) #获取上下文 ctx=multiprocessing.get_context(& # 39;产卵# 39;) #检查这是否是冻结的可执行文件中的伪分支进程。 ctx.freeze_support () 主要(ctx)python在线程中处理主进程和子线程关系的方法