Lock对多线程执行效率的影响

Python 多线程教学笔记 python 多线程 Threading(源自莫烦python)莫烦Python多线程教程 一、对多线程的定义: 多线程就是在python中分出多个线程同时进行运算,把每个需要运算的程序放入不同的线程里面,让这些程序同时运算从而缩短计算的时间。 二、 ... 阅读详情

假定有n个线程执行同一段代码,如果不需要使用lock保护并发操作,则每个线程完成代码执行的时间理论上是相同的,假定为t。假设整个任务需要重复执行上述代码m次,n≤t,则理论上该任务的执行时间为 T_{0} = (k+1) \cdot t (l>0)或k \cdot t(l=0),其中m = k \cdot n + l。如果每个线程独占一个CPU核心,则线程执行过程如图1所示。
thread without lock

图1 无lock的多线程执行过程

如果代码执行过程中需要lock保护,线程一开始执行就需要获取lock,线程执行过程如图2所示,其中被lock的代码执行时间为p。整个任务执行时间为T_{lock}=k[t+(n-1)p]+[t + (l-1) \cdot p]。
这里写图片描述
图2 有lock的多线程执行过程

假设l > 0,则T_{lock}和T的差为:
T_{lock}-T = [k(n-1)+l-1]p \approx k(n-1)p
在CPU核心确定的情况下,即n取定的情况下,线程重复执行代码的次数k愈多,需要lock保护的代码执行时间p越长,则带lock的多线程执行时间就越长。由于任务是确定的,即k确定,因此,为了提升程序效率,一般需要尽量减少p,即尽量减少需要lock保护的代码。
下面的python代码可以用来对比实际执行时间,无lock保护的执行时间是9.827271938323975,带lock保护的执行时间是13.370273351669312。

import threading
import time

queue = [i for i in range(20)]
NUM_THREAD = 4
locker = threading.Lock()


def execute_task():
    global queue, locker
    while queue:
        n = 0
        # locker.acquire()
        for i in range(1000000):
            n += i * i
        if queue:
            queue.pop()
        # locker.release()
        n = 0
        for i in range(1000000):
            n += n * (n + i)

start_time = time.time()
for i in range(NUM_THREAD):
    th = threading.Thread(target=execute_task)
    th.start()
while queue:
    pass
elapsed_time = time.time() - start_time
print(elapsed_time)
线程并发时 本地变量和Lock锁的效率比较 多线程下访问公共变量时,一般lock和 启用线程本地变量 两者的效率比较。 立即下载

相关推荐

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 379

加锁之后线程池执行任务的速度会降低吗?

加锁会导致线程池执行任务的速度降低,因为加锁会导致线程之间的竞争,增加了线程之间的等待时间。

weixin_35755188的博客 221

最新版谷歌浏览器Axure插件(免翻墙)

本文介绍了在Chrome浏览器无法直接打开Axure导出HTML文件的解决方法。由于国内网络限制无法访问Chrome商店,需手动下载安装AxureRP扩展插件(提供百度网盘下载链接)。安装步骤包括:1)启用开发者模式;2)拖拽CRX文件或加载解压文件夹;3)勾选"允许访问文件网址"。同时还提示若浏览器版本过低可能无法正常运行,并给出了浏览器升级方法。该教程详细说明了从插件安装到浏览器升级的完整解决方案。

OldCat先生 2973

Lock使用及效率分析(C#)

针对无Lock、Lock、ReadWriterLock、ReadWriterLockSlim四种方式,测试在连续写的情况下,读取的效率(原子操作Interlocked由于使用针对int,double等修改的地方特别多,而且使用范围受限,所以本文章没有测试)

谷棵的专栏 623

linux和mac安装+配置circos(

一定要下载完这两个包,GD才会work,要不然会报错,且-modules显示也是fail。官网的教程说的很明白,但是很多包都已经过时了需要在网上找。一般来讲,所有包的安装都不会太困难,除了GD。1.是因为官网给的链接下出来的tgz无法解压。2.我的电脑安装后GD照样是fail的。,进入这个地址下一个.tgz。第二点的原因在于,官网的情况。,进入这个地址,按部就班。GD安装困难有以下几点。搞了一天终于配置成功。

xiufan1的博客 549

交叉编译Qt6.5.3(RK3568开发板)

注意,如果使用其它版本的交叉编译器的话,请确保你的交叉编译器能够支持 C++17标准。为确保后续交叉编译没问题,需要确保开发板使用的GLIBC版本不小于2.34版本。到 linaro 网站上下载交叉编译工具,我下载的是 gcc-linaro-11.3.1-2022.06-x86_64_aarch64-linux-gnu.tar.xz。安装 CMake ,最低要求3.16版本,如果要静态编译,需要3.21及以上版本。我使用的3.27版本。:指定为最后交叉编译后的Qt6.5.3库的安装目录。

m0_46309425的博客 5101

Lock基本使用及原理分析

JUC并发工具包 java.util.concurrent Lock 重入锁,记录获得锁的次数 ReentrantLock实现Lock ReentrantLock原理 AQS(同步工具) 实现线程同步,同步组件 AQS基本实现 .lock()去获取锁原理。 表示当前线程获取锁成功 非公平锁允许插队 CAS jvm层面实现原子操作。 实现原子性,和内存中值相比(state和expect相比较,相等update,cas成功了),将0变为1,说明线程获取锁成功,返回boolean值true,实现锁的获得,乐

weixin_44149903的博客 909

国科大《人工智能原理与算法》2021年期末试题+2024经验(2025指南)

2021年期末试题+24年复习指南

MatsumotoChrikk 2926

C# lock和Interlocked性能测试

https://blog.youkuaiyun.com/sinat_31608641/article/details/108033922 一、测试代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 测试int.

zunguitiancheng的专栏 904

SAP项目中 Waterfall vs Agile 的深度对比分析背景:方法论的演进SAP项目实施方法论经历了显著的代际更替。早期以 ASAP(Accelerated SAP) 为代表,采用经典瀑

本文对比分析了SAP项目实施中瀑布模型(ASAP)与敏捷方法(SAP Activate)的核心差异。瀑布模型采用线性流程,需求固定但变更成本高;敏捷方法则通过迭代开发实现动态调整,强调最佳实践和用户持续参与。文章指出,SAP系统的复杂性使纯粹敏捷难以实施,需在标准化与定制化间取得平衡。最终建议根据项目特性选择方法论:稳定需求适用瀑布模型,变化频繁则推荐敏捷,而SAP Activate本质上是两者的结构化融合,代表未来趋势。关键在于匹配项目实际需求,而非盲目追随方法论潮流。

金牌架构师 345

图机器学习(2)——图的可视化

图结构可通过图形化方式直观呈现。节点通常用圆形表示,边则用连接线表示。然而当节点和边数量增加时,绘制清晰的图形表示可能会变得相当困难,这主要源于节点在二维坐标系中的布局问题。对于包含数百个节点的图,手动指定每个节点的坐标显然不切实际。在本节中,我们将介绍如何在不指定每个节点坐标的情况下绘制图形。我们将利用两种不同的解决方案:networkx 和 Gephi。

盼小辉丶的博客 8724

多线程--Lock (C#)

简述 使用多线程时,不可避免的会遇到线程安全的问题,从而需要为使用多线程代码的安全执行考虑 注意点 lock只对多线程有效,对单线程无效 不推荐使用lock(this),因为在它外部也可以访问它 简单案例 ...

jia1909756547的博客 2546

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法

Robot_PLC_HMI_Automation 2916

Lock语句(C# )

Lock关键字用于将指定对象进行锁定,防止其他线程对此对象进行访问操作,直到代码块内的语句执行完毕,然后释放该锁。 1 Object thisLock = new Object(); 2 lock (thisLock) 3 { 4 // Critical code section. 5 } 如以下多线程对同一对象进行操作的代码中lock语句被注释了,那么运行结果将...

weixin_30419799的博客 183

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

多线程学习(一)

目录 什么是多线程 多线程的意义 如何在代码中使用多线程 多线程含义: 多线程在实际业务中的解决的问题 如何使用? synchronized lock 线程定义方式(Thread Runnable Callable-FutureTask一起使用实现有返回值得异步线程) 线程的优先级:线程分为10个优先级 常用 0 5 10 默认为5.线程优先级越大表示有很大的概率先执...

chenxue843400447的博客 118

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Python多线程 Threading

Python多线程 Threading

sikh_0529的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

多线程(python)

多线程的定义 多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” 。 添加线程 导入模块 import threading 获取已激活的线程数 threading.active_count() #

如果想成为中心,那么就到中心去吧。 847

Python之多线程

Python的对线程为什么被说成是鸡肋?       1.1GIL是什么?(Global Interpreter Lock)Python设计之初,为了数据的安全所做的决定。       1.2Python 多线程下,每个线程的执行方式:         1.2.1获取GIL         1.2.2执行代码到sleep或者是Python虚拟机将其挂起         1.2.3...

weixin_30702413的博客 70

多线程开发——全局静态变量之我见

在cs(c#)系统时会用到很多的多线程泛型静态集合变量,尤其是会在很多的线程中同时使用这些静态变量,这种时候该怎么做呢?网上有的人说用队列比较好,但是队列的操作非常的不灵活。如果你只有多线程读取和多线程的输出是可以用的,例如:你读取多个端口的值,然后存储到数据中,可以使用线程同步的队列,可以保证变量的线程同步。但是当你需要去操作里面的对象的时候就不建议你使用了,因为一点都不灵活。这时候的方...

cdc8596的博客 1207

性能对比pthread mutex/spin lock/spin lock delay

代码 代码如下 main.cc // // Created by 孙川 on 2018/8/13. // #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;pthread.h&amp;amp;gt; #include &amp;quot;spin.h&amp;quot; using std::cout; using std::endl; pthread_mute

sunashe的个人随笔 743

python 为什么io密集要用多线程

IO传输过程分为:发送消息,等待返回消息。python多线程在处理io的时候,一个线程获得GIL发送消息,然后等待返回消息(阻塞),python此时释放GIL, 其他线程得到GIL发送消息,然后同样等待返回消息(阻塞)......,这样保证了IO传输过程时间的合理利用,提高io传输效率。但是基于一个cpu时间片只能运行一个线程(GIL),所以多线程在多个cpu利用中,并不会提高程序效率,反而还会因...

qq_32446743的博客 4655

python的多线程适合计算密集操作_Python 多线程操作学习

Python 多线程操作什么是线程:线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。举个简单的例子来理解下:假定有一 7 * 24 小时不停工...

weixin_39977886的博客 294

GIL

GIL 不一定有效率 python 的多线程 threading 有时候并不是特别理想. 最主要的原因是就是, Python 的设计上, 有一个必要的环节, 就是 Global Interpreter Lock (GIL). 这个东西让 Python 还是一次性只能处理一个东西. 我摘抄了一段对于 GIL 的解释. 尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在...

caopenpen的专栏 163

threading多线程试用

# -*- coding: utf-8 -*- import threading from time import ctime,sleep import time def h(): sum=0 for j in range(200): print('hello') print('end') def b(arg): for j in rang

LY的博客 282

Threading学会多线程Python

介绍了Python如何使用多线程。纯小白教学,创建、queue、join、GIL、lock...

不想随波逐流的大学生一枚,我们每个人都在努力奔跑 2407

python线程问题_对于Python中线程问题的简单讲解

我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争。你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果。声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西。示例1我们将要请求五个不同的url:单线程?输出是:?解释:url顺序的被请求除非cpu从一个url获得了回应,否则不会去请求下一个url网络请求会花费较长...

weixin_39524984的博客 100
上一篇: clean code之路——函数
下一篇: python工厂模式代码示例
无花果树
博客等级 码龄10年 12粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值