python多线程学习总结(一) 参数setDaemon

场景:

项目代码中,多线程并不像自己预期的跑下去。所以简化代码,研究下多线程的参数和运行流程

代码:
import threading

start_time = time.time()

def push(num):
    print('thread_num: {}, start'.format(num))
    time.sleep(1)
    print('thread_num: {}, end'.format(num))

threads = []
t1 = threading.Thread(target=push, args=('1',))
threads.append(t1)
t2 = threading.Thread(target=push, args=('2',))
threads.append(t2)
t3 = threading.Thread(target=push, args=('3',))
threads.append(t3)

if __name__ == '__main__':
    for t in threads:
        t.start()

启了三个线程运行了push方法,push方法中加了耗时操作。

结果1:

thread_num: 1, start
thread_num: 2, start
thread_num: 3, start
thread_num: 1, end
thread_num: 2, end
thread_num: 3, end

这时的运行是按照预期来的。
开始加参数 t.setDaemon(True)

# 重复没做改动的代码就不贴了哦
if __name__ == '__main__':
    for t in threads:
    	t.setDaemon(True)
        t.start()

####### 结果2:
thread_num: 1, start
thread_num: 2, start
thread_num: 3, start

不是我少贴了,而是运行结果就是这样。
对于守护线程参数的解释是这样的:
守护线程是守护主线程
t.setDaemon(True): 调用函数里面存在等待时间时,只要设置了守护线程,函数中等待时间下面的代码都不会再执行
疑问:
如果不是等待时间,是耗时操作呢 还会不会跳过不执行呢?
如果它为False的话,运行结果又是什么样子?

实验代码:
import threading

cursor = MongoTool(db='XXX', table='XXX')

def push(num):
    print('thread_num: {}, start'.format(num))
    results = cursor.find_item(filter={})
    print(len(results))
    print('thread_num: {}, end'.format(num))

threads = []
t1 = threading.Thread(target=push, args=('1',))
threads.append(t1)
t2 = threading.Thread(target=push, args=('2',))
threads.append(t2)
t3 = threading.Thread(target=push, args=('3',))
threads.append(t3)

if __name__ == '__main__':
    for t in threads:
        t.setDaemon(True)
        t.start()
结果3:

–thread_num: 1, start
–thread_num: 2, start
–thread_num: 3, start
没错,又结束了 不过这次不一样的是 它是等了3s后,进程才结束的
results = cursor_rw.find_item(filter={})
这部分是从数据库查数据 90w条 算是耗时操作了 执行结果不知道跟你想的一致不

if __name__ == '__main__':
    for t in threads:
        t.setDaemon(False)
        t.start()

setDaemon(False)时, 运行结果=结果1。正常等待子线程运行结束。

结论:

–结论1-t.setDaemon(True) 加上守护线程后,当线程里有sleep()的话,它会不做等待,直接结束。
–结论2-当线程里有耗时操作的话,它会等待主线程结束后,整体结束 不会等待子线程操作。
–结论3-当把它设为False时,它的打印结果跟不设置它一样,说明它是默认使用,默认值为False。

通过结论得出参数适用场景:

–t.setDaemon(True) 适用于主线程结束,就整体代码结束,不等待子线程操作。
----优势:效率高,不用强行等待子线程完成
----劣势: 多个线程整体速度快,无耗时操作的情况下还好,否则可能会出现子线程执行不完的情况
–t.setDaemon(False)适用于各个线程操作都需要完整完成的情况。
----优势: 线程操作完整。
----劣势: 如果单个子线程消耗时间过多的话,整体会等待子线程完成。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值