Python threading中lock的使用详解
作者:锅炉房刘大爷 发布时间:2023-01-16 08:32:26
在多线程中使用lock可以让多个线程在共享资源的时候不会“乱”,例如,创建多个线程,每个线程都往空列表l中添加一个数字并打印当前的列表l,如果不加锁,就可能会这样:
# encoding=utf8
import threading
import time
lock = threading.Lock()
l = []
def test1(n):
lock.acquire()
l.append(n)
print l
lock.release()
def test(n):
l.append(n)
print l
def main():
for i in xrange(0, 10):
th = threading.Thread(target=test, args=(i, ))
th.start()
if __name__ == '__main__':
main()
运行结果:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3][
0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4[, 05, , 16, , 27, ]3
, 4, 5, 6[, 07, , 18, ]2
, 3, 4, [50, , 61, , 72, , 83, , 94],
5, 6, 7, 8, 9]
因为每个线程都在同时往l中添加一个数字(当前每个线程运行的是test函数),然后又可能在同时打印l,所以最后的结果看起来会有些“混乱”。
下面让每个线程调用“test1”函数,看看结果如何:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
现在看起来就好多了,因为test1中每次像l中添加数字并打印之前,都先加了一把“锁”,这样就可以保证每次只有一个线程可以往l中添加数字,而不是同时往l里添加数字。
通过上面的结果比较可以知道,当多线程中需要“独占资源”的时候,要使用锁来控制,防止多个线程同时占用资源而出现其他异常。
使用锁的时候就调用acquire()方法,以此告诉其他线程,我正在占用该资源,你们要等会;待使用资源后需要释放资源的时候就调用release()方法,告诉其他线程,我已经完成使用该资源了,其他人可以过来使用了。
python threading Lock
这篇文章主要是通过代码说明:
threading.Lock()
不影响multiprocessing
.
threading.Lock()
影响threading
.
代码如下:
import threading
import time
from multiprocessing import Pool
_lock = threading.Lock()
def small_func(value):
"""
添加线程锁
:param value:
:return:
"""
print(value)
with _lock:
time.sleep(5)
return value
def no_small_func(value):
"""
没有线程锁
:param value:
:return:
"""
print(value)
# with _lock:
time.sleep(5)
return value
def main():
"""
multiprocessing 是基于进程的,因此线程锁对其不影响,
:return:
"""
st = time.time()
p = Pool(processes=4)
value = p.map(func=small_func, iterable=range(4))
et = time.time()
print(f"all use time: {et - st}")
print(value)
def main2():
"""
threading 受到 线程锁 影响
:return:
"""
st = time.time()
thread_list = []
for temp_value in range(4):
t = threading.Thread(target=small_func, args=(temp_value,))
t.start()
thread_list.append(t)
for i in thread_list:
i.join()
et = time.time()
print(f"all use time: {et - st}")
# print(value)
def main3():
st = time.time()
thread_list = []
res = []
for temp_value in range(4):
# 不加线程锁就行了
t = threading.Thread(target=no_small_func, args=(temp_value,))
t.start()
thread_list.append(t)
for i in thread_list:
v = i.join()
res.append(v)
et = time.time()
print(f"all use time: {et - st}")
print(res)
if __name__ == '__main__':
# main()
# main2()
main3()
来源:https://blog.csdn.net/u012067766/article/details/79733801


猜你喜欢
- pip镜像源在国内如果不使用 VPN 是没办法好好使用 pip 命令安装任何 Python 包的。所以另一个选择就是使用国内各大厂的开源镜像
- matplotlib简介如果你在大学里参加过数学建模竞赛或者是用过MATLAB的话,相比会对这一款软件中的画图功能印象深刻。MATLAB可以
- 近年来,广告已成为很多网站的主要收入来源。不久前,在线广告往往遭到访客的拒绝,广告客户也不确定它的价值和效力。今天,大多数访客期望在商业网站
- 主键自增MySQL 提供了主键自增机制 AUTO_INCREMENT. 对主键使用, 保证了主键的唯一性.注意:自增长必须与主键字段配合使用
- 爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页
- #/bin/sh #检测mysql server是否正常提供服务 mysqladmin -u sky -ppwd -h localhost
- 自从接触了python,再到机器学习和深度学习,要学习的东西向越拉越多了!!!因为课题的需要接触了tensorflow,我直接就是一个好家伙
- 数据结构树简介一、树简介树(Tree)是一种抽象的数据结构,是一个数据的集合,集合中的数据组成了一个树状结构。例如上图,看起来像一棵倒挂的树
- 本文实例讲述了python装饰器原理与用法。分享给大家供大家参考,具体如下:你会Python嘛?我会!那你给我讲下Python装饰器吧!Py
- 5.0版本和之前版本的差异较大,本篇对熟悉3.2版本的用户给出了一些5.0的主要区别。URL和路由5.0的URL访问不再支持普通URL模式,
- if (context.Request.UserAgent.ToLower().IndexOf(&qu
- 程序很简单,主要是 mp3play 模块的应用import mp3play, timefilename = "Should It
- 利用python 写一些网络服务的时候,当网络状况不好,或者资源占用过多,任务拥塞的情况下,总会抛出一些异常,当前任务就被终止了,可以很好的
- 1.pycharm运行python脚本的过程使用pycharm等编辑器run/debug运行python脚本时,编辑器会通过本地python
- 写在前面:在上一篇文章中介绍了栈这个数据结构,这篇文章介绍一下队列。什么是队列?队列是一种先进先出的数据结构,队列中允许两种基础操作,也就是
- 项目开发中文件的读写是必不可少的下面来简单介绍一下文件的读读文件,首先我们要有文件那我首先自己创建了一个文本文件password.txt内容
- 抛出问题:求一数组如 l = [0, 1, 2, 3, -4, 5, -6],求该数组的最大连续子数组的和 如结果为[0,1,2,3,-4,
- 本文实例讲述了Python字符串拼接、截取及替换方法。分享给大家供大家参考,具体如下:python字符串连接python字符串连接有几种方法
- python将数据换为txt的方法有很多,可以用xlrd库实现。本人比较懒,不想按太多用的少的插件,利用已有库pandas将excel文件转
- Application-settings我们在创建tornado.web.Application的对象时,传入了第一个参数&mdas