python中级第十五课--并发之启动和停止线程(小白piao分享)

目的:

        为了让代码能够并发执行,向创建线程并在核实的时候销毁它。

方法:

        由于目的比较单纯,只是讲解基础的线程创建方法,所以可以直接使用threading库中的Thread类来实例化一个线程对象。

from threading import Thread

def running_time(n):# 此函数可以称之为线程处理函数;即在线程中所做的事情
    import time
    while n>0:
        n -= 1
        print(n)
        time.sleep(2)
    print('done ...')# 线程中事务处理完成的提示

t = Thread(target=running_time,args=(10,))# 创建线程t,事务处理函数为running_time,函数参数实参为10
t.start()# 线程在创建之初是不会运行的,只有在使用start之后才会启动
var = 5
while var:
    var-=1
    import time
    time.sleep(1)
    print('this is main thread... running below',var,'s')
t.join()# 加入到t中去,换句话说,主线程会等待t线程运行结束;join具有阻塞性;不加这句话,主线程会自动结束,而线程t仍在运行直到结束
print('main thread is end ...')#在t结束后再结束主线程

# 为了方便你们看结果,我将结果粘贴在此处
'''
9
this is main thread... running below 4 s
this is main thread... running below 3 s
8
this is main thread... running below 2 s
7
this is main thread... running below 1 s
this is main thread... running below 0 s
6
5
4
3
2
1
0
done ...
main thread is end ...
'''

        例子,用户输入两个数字,并且求其两个数字的四则运算的结果:

from threading import Thread

def add_func(x,y):
    print(x + y)
def sub_func(x,y):
    print(x - y)
def mult_func(x,y):
    print(x * y)
def div_func(x,y):
    print(x / y)

lt_func = [add_func,sub_func,mult_func,div_func]

num1, num2 = int(input('请输入数字1:')), int(input('请输入数字2:'))# 请各位不要纠结这里有没有异常的问题,这不是博客的重点
for func in lt_func:
    t = Thread(target=func,args=(num1, num2))
    t.start()
 
# 结果为:
'''
请输入数字1:20
请输入数字2:13
33
7
260
1.5384615384615385

Process finished with exit code 0
'''  

        除了以上的一些功能以外,在python线程中没有其他的诸如给线程发信号、设置线程调度属性、执行任何其他高级操作的功能了,如果需要这些功能,就需要手工编写了。
        另外,需要注意的是,由于GIL(全局解释器锁)的存在,限制了在python解释器当中只允许运行一个线程。基于这个原因,不停该使用python线程来处理计算密集型的任务,因为在这种任务重我们希望在多个CPU核心上实现并行处理。Python线程更适合于I\O处理以及设计阻塞操作的并发执行任务(即等待IO响应或等待数据库取出结果等)。

如何判断线程是否已经启动?

目的:我们加载了一个线程,但是想要知道这个线程什么时候才会开始运行?

方法:

        线程的核心特征我认为就是不确定性,因为其什么时候开始运行,什么时候被打断,什么时候恢复执行,这不是程序员能够控制的,而是有系统调度来完成的。如果遇到像某个线程的运行依托于其他某个线程运行到某个状态时该线程才能开始运行,那么这就是线程同步问题,同样这个问题非常棘手。要解决这类问题我们要借助threading中的Event对象。
        Event其实和条件标记类似,匀速线程等待某个时间发生。初始状态时事件被设置成0。如果事件没有被设置而线程正在等待该事件,那么线程就会被阻塞,直到事件被设置位置,当有线程设置了这个事件之后,那么就会唤醒正在等待事件的线程,如果线程等待的事件已经设置了,那么线程会继续执行。

一个例子:

from threading import Thread, Event
import time

def countdown(n, start_evt):
    print('count starting ...')
    start_evt.set()
    while n:
        n -= 1
        time.sleep(2)

start_evt = Event()

t = Thread(target=countdown,args=(5,start_evt))
t.start()

start_evt.wait()# 没有了join(),但是同样countdown的打印永远会出现在count starting之后
print('countdown is end ...')

#结果:
count starting ...
countdown is end ...

        如上能够确定的是,主线程会在线程t运行结束时再运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白piao

创作不易,支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值