多线程
1、并发---------------------------------------------------------------------------------------------------------------------------
<h3>同时发起多个任务,但是我们的任务是一个一个交替执行的
并行---------------------------------------------------------------------------------------------------------------------------
任务数量小于或等于核心的数量,同时执行
///////////////////////////////////////////////////////
补充:对比线程和进程
(1)、定义
进程:是操作系统分配资源的调度的基本单元
线程/:是依赖于进程执行,线程是cpu执行调度的最小单元
(2)、区别:
进程是会分配资源空间,每一个进程之间的资源不共享
线程则不会占用资源空间,线程之间的资源是共享想得,为了防止资源的错乱。我们一般加线程锁
(3)、使用的场景
进程一般情况下处理机算密集型任务
线程一般情况下处理IO密集型任务
//////////////////////////////////////////////////////////
2、*********************线程的执行顺序
import threading
import time
def do():
print('我要唱歌*****'+threading.current_thread().name)
time.sleep(1)
def tiao():
print('我哟=体哦啊'+threading.current_thread().name)
time.sleep(1)
if name == 'main**':
threads = []
for i in range(50):
#创建线程
td1 = threading.Thread(target=do)
threads.append(td1)
td2 = threading.Thread(target=tiao)
threads.append(td2)
for thread in threads:]
#开启线程
thread.start()
# td1.join()
3、/多线程
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用
多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞,到sleep结束后,线程进入就绪状态,等待调度。而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定。
注意:
多线程的优点是:在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据
多线程的缺点:缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)
4、/互斥锁:
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁
注意:
如果这个锁之前是没有上锁的,那么acquire不会堵塞
如果在调用acquire对这个锁上锁之前 它已经被 其他线程上了锁,那么此时acquire会堵塞,直到这个锁被解锁为止
5、锁的好处:确保了某段关键代码只能由一个线程从头到尾完整地执行
6、锁的坏处:阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁