MSCBSC 移动通信论坛
搜索
登录注册
网络优化工程师招聘专栏 4G/LTE通信工程师最新职位列表 通信实习生/应届生招聘职位
 

  • 阅读:2119
  • 回复:0
PYTHON学习笔记【多线程】
细阿哥
初级会员
鎵嬫満鍙风爜宸查獙璇


 发短消息    关注Ta 

积分 480
帖子 96
威望 3797 个
礼品券 15 个
专家指数 0
注册 2009-2-25
专业方向  通信
回答问题数 1
回答被采纳数 0
回答采纳率 0%
 
发表于 2019-11-15 11:09:00  只看楼主 

1.      多线程

线程:是进程中一个单一的连续控制流程”(a single sThread,equential flow of control)/执行路径,一个进程至少要有一个以上的线程

1)     线程又被称为轻量级进程(light weight process)

2)     Threads run at then same time,independently of one another

3)     一个进程可拥有多个并行行的(concurrent)线程

4)     一个进程中的线程共享相同的内存单元/内存地址空间->可以访问相同的变量和对象,而且它们从同一堆中分配对象->通信、数据数据交换、同步操作

5)     由线线程间的通信是在同一地址同空上进行的,所以不需要额外的通信机制,这就使得通信更简便,而且信息传递的速度也更快

6)     进程是系统进行资源分配和调度的一个独立单位

7)     进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的的运行效率

8)     一个程序至少有有一个进程,一个进程至少有一个线程

9)     线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位

10)   线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一级寄存器和栈),但是它可与与同属一个进程的的其他线程共享进程所拥有的全部资源

11)   线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高

12)   线程不能独立执行,必须依存在进程中

13)   线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护,而进程正相反

区别

进程

线程

根本区域

作为资源分配的单位

调度和执行的单位

开销

每个进程都有独立的代码和和数据空间(进程上下文),进程进程间的切换会有较大的的开销

线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器PC,线程切换的开销小

所处环境

在操作系统中能同时运行多多个任务(程序)

在同一应用程序中有多个顺序流同时执行

分配内存

系统在运行的时候会为每个进程分配不同的内存区域

除了CPU之外,不会为线程分配内存(线程所使用的资源是它所属的进程资源),线程组只能共享资源

包含关系

没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的

线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程进程

 

pythonthread模块是比较底层的模块

pythonthreading模块是对thread做了一些包装的,可以更加方便的被使用                                               image.png

threading模块

image.png

例,统计线程数

image.png

 

例,线程的子类化

image.png

 

线程的几种状态

多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(BLOCKED),到sleep线束后,线程进入就绪(RUNNABLE)状态,等待调度。

而线程调度将自行选择一个线程执行。代码中只能保证每个线程都运行完整个run函数,但是线程启动顺序、run函数中每次循环的执行顺序都不能确定。

image.png

线程共享全局变量

在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)

缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)

*  方法不带参数:

image.png

*  方法带参数,不可变类型(未对全局变量进行修改)

image.png

*  方法带参数,可变类型(可以对全局变量进行修改)

image.png

线程同步问题

image.png

g_num+1  ->  g_num=g_num+1

g_num原先存放在内存,g_num+=1操作分三步:

1CPU得先从内存将g_num的值读到寄存器;

2、在寄存器中将读出来的数加1

3、将寄存器的值写回到内存

不同线程不同步,导致寄存器写入值时,出现紊乱。

 

1.      线程同步说明

1)     当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制

2)     线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁

3)     互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性

4)     某个线程要更改共享数据时,先将其锁定,此时资源的状态为锁定,其他线程不能更改;直到该线程释放资源,将资源的状态变成非锁定,其他的线程才能再次锁定该资源

5)     threading模块中定义Lock类,可以方便的处理锁定

*  创建锁

mutex=Threading.Lock()

*  锁定

mutex.acquire([blocking])

a)     如果设定blockingTrue,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)

b)     如果设定blockingFalse,则当前线程不会堵塞

*  释放

mutex.release()

image.png

2.      死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁

入到死锁状态,可以使用ctrl+Z退出

 

3.      通过锁控制线程的执行顺序

image.png

 

4.      pythonQueue模块中提供了同步的、线程安全的队列类,包括

*  FIFO(先入先出)队列Queue

*  LIFO(后入先出)队列LifoQueue       #

*  优先级列队PriorityQueue

这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用

image.png

5.      ThreadLocal变量

一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题

可以理解为全局变量local_school是一个dict,可以绑定其他变量

ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,http请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。ThreadLocal 真正做到了线程之间的数据隔离

image.png


微信扫描分享本文到朋友圈
微信扫描二维码,手机阅读更便捷
每天分享朋友圈可获得威望奖励(前两次)

对本帖内容的看法? 我要点评

 
[充值威望,立即自动到帐] [VIP贵宾权限+威望套餐] 另有大量优惠赠送活动,请光临充值中心
充值拥有大量的威望和最高的下载权限,下载站内资料无忧

快速回复主题    
标题
内容
 上传资料请点左侧【添加附件】



当前时区 GMT+8, 现在时间是 2019-12-6 18:28:54
渝ICP备11001752号  Copyright @ 2006-2016 mscbsc.com  本站统一服务邮箱:mscbsc@163.com

Processed in 0.017046 second(s), 14 queries , Gzip enabled
TOP
清除 Cookies - 联系我们 - 移动通信网 - 移动通信论坛 - 通信招聘网 - Archiver