python并发编程-线程和锁
2019-01-15 07:05:55来源:博客园 阅读 ()
什么是线程
进程:资源分配单位
线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程
线程的两种创建方式:
from multiprocessing import Process def f1(n): print(n,'号线程') if __name__ == '__main__': t1 = Thread(target=f1,args=(1,)) t1.start() print('主线程')
二
from threading import Thread class MyThread(Thread): def __init__(self,name): super().__init__() self.name = name def run(self): print('hello:' + self.name) if __name__ == '__main__': t = MyThread('haha') t.start() print('主线程结束')
线程的创建和销毁,相对于进程来说开销特别小
线程之间资源共享,共享的是同一个进程中的资源, 资源共享就涉及到数据安全问题,加锁来解决
线程锁
From threading import Thread,Lock
def f1:
Loc.acquire()
代码
Loc.release()
main
Loc = Lock()
T = thread(target=f1,args=(loc,)
from multiprocessing import Queue import queue import time from threading import Lock,Thread num = 100 def f1(loc): loc.acquire() global num tmp = num tmp -= 1 time.sleep(0.001) num = tmp loc.release() if __name__ == '__main__': t_loc = Lock() t_list = [] for i in range(10): t = Thread(target=f1,args=(t_loc,)) t.start() t_list.append(t) [tt.join() for tt in t_list] print('主线的num',num)
锁:牺牲了效率,保证了数据安
死锁现象(天长地久,永不分离):
出现在锁嵌套的时候,双方互相抢对方已经拿到的锁,导致双方互相等待,这就是死锁现象
import time from threading import Thread,Lock,RLock def f1(locA,locB): locA.acquire() print('f1>>1号抢到了A锁') time.sleep(1) locB.acquire() print('f1>>1号抢到了B锁') locB.release() locA.release() def f2(locA,locB): locB.acquire() print('f2>>2号抢到了B锁') locA.acquire() time.sleep(1) print('f2>>2号抢到了A锁') locA.release() locB.release() if __name__ == '__main__': locA = Lock() locB = Lock() t1 = Thread(target=f1,args=(locA,locB)) t2 = Thread(target=f2,args=(locA,locB)) t1.start() t2.start()
递归锁:
解决死锁现象
Rlock 首先本身就是个互斥锁,维护了一个计数器,每次acquire就+1,release就-1,当计数器为0的时候,大家才能抢这个锁
import time from threading import Thread, Lock, RLock def f1(locA, locB): locA.acquire() print('f1>>1号抢到了A锁') time.sleep(1) locB.acquire() print('f1>>1号抢到了B锁') locB.release() locA.release() def f2(locA, locB): locB.acquire() print('f2>>2号抢到了B锁') locA.acquire() time.sleep(1) print('f2>>2号抢到了A锁') locA.release() locB.release() if __name__ == '__main__': locA = locB = RLock() t1 = Thread(target=f1, args=(locA, locB)) t2 = Thread(target=f2, args=(locA, locB)) t1.start() t2.start()
守护线程:
守护线程:等待所有非守护线程的结束才结束
守护进程:主进程代码运行结束,守护进程就随之结束
import time from threading import Thread from multiprocessing import Process def f1(): time.sleep(2) print('1号线程') def f2(): time.sleep(3) print('2号线程') if __name__ == '__main__': t1 = Thread(target=f1,) t2 = Thread(target=f2,) t2.daemon = True t1.start() t2.start() print('主线程结束')
GIL锁 :
cpython解释器上的一把互斥锁,当线程需要进入cpu做运算时必须一个一个经过GIL锁
线程的事件,信号量 与进程的事件,信号量 用法相同.
原文链接:https://www.cnblogs.com/a2534786642/p/10268544.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash