FalseSharing-伪共享

1.CPU缓存

要了解什么是伪共享,首先得了解CPU缓存架构与缓存行的知识

(1)<CPU缓存架构>

主内存RAM是数据存在的地方,CPU和主内存之间有好几级缓存,因为即使直接访问主内存相对来说也是非常慢的。如果对一块数据做相同的运算多次,那么在执行运算的时候把它加载到离CPU很近的地方就有意义了,避免每次都到主内存中去取这个数据。
image.png
越靠近CPU的缓存越快也越小,所以L1缓存很小但很快,并且紧靠着在使用它的CPU内核。
L2大一些,但也慢一些,并且仍然只能被一个单独的CPU核使用。
L3在现代多核机器中更普遍,仍然更大,更慢,并且被单个插槽上的所有CPU核共享。
最后,主内存保存着程序运行的所有数据,它更大,更慢,由全部插槽上的所有CPU核共享。
image.png
当CPU执行运算的时候,它先去L1查找所需的数据,再去L2,然后L3,最后如果这些缓存中都没有,所需的数据就要去主内存拿。
走得越远,运算耗费的时间就越长。所以如果进行一些很频繁的运算,要确保数据在L1缓存中。

(2)<CPU缓存行>

缓存失效其实指缓存行失效,Cache是由很多个Cache line 组成的,每个缓存行大小是32~128字节(通常是64字节)。我们这里假设缓存行是64字节,而java的一个Long类型是8字节,这样的话一个缓存行就可以存8个Long类型的变量,如下图所示。CPU 每次从主内存中获取数据的时候都会将相邻的数据存入到同一个缓存行中。假设我们访问一个Long内存对应的数组的时候,如果其中一个被加载到内存中,那么对应的后面的7个数据也会被加载到对应的缓存行中,这样就会非常快的访问数据。
image.png

2.伪共享

根据MESI协议(缓存一致性协议),我们知道在一个缓存中的数据变化的时候会将其他所有存储该缓存的缓存(其实是缓存行)都失效。

(1)<示例概述>

下图中显示的是一个槽的情况:里面是多个CPU, 如果CPU1上面的线程更新了变量X,根据MESI协议,那么变量X对应的所有缓存行都会失效(由于X和Y被放到了一个缓存行,所以一起失效了),这个时候如果cpu2中的线程进行读取变量Y,发现缓存行失效,想获取Y就会按照缓存查找策略,往上查找。如果期间cpu1对应的线程更新X后没有访问X(也就是没有刷新缓存行),cpu2的线程就只能从主内存中获取数据,对性能就会造成很大的影响,这就是伪共享。
表面上 X 和 Y 都是被独立线程操作的,而且两操作之间也没有任何关系。只不过它们共享了一个缓存行,但所有竞争冲突都是来源于共享。
image.png

(2)<解决方法>

这个问题的解决办法有两个:
1.使用对齐填充,因为一个缓存行大小是64个字节,如果读取的目标数据小于64个字节,可以增加一些无意义的成员变量来填充。
2.在Java8里面,提供了@Contented注解,它也是通过缓存行填充来解决伪共享问题的,被@Contented注解声明的类或者字段,会被加载到独立的缓存行上。

本文转载于网络 如有侵权请联系删除

相关文章

  • 补码加、减运算规则「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。在计算机中,通常总是用补码完成算术的加减法运算。其规则是:   [X+Y]补=[X]补+[Y]补,[X-Y]补=[X]补–[Y]补=[X]补+[-Y]补这表明,有了补码表示的被加(减)数和加(减)数,要完成计算补码表示的二数之和或二数之差,只需用二数的补码直接执行加减运算即可,符号位与数值位同等对待,一起参加运算,若运算结果不溢出,即不超出计算机所能表示的范围,则结果的符号位和数值位同时为正确值。此外,还可以看到,实现减运算时,用的仍是加法器线路,把减数的负数的补码送加法器即可。在有了一个数的补码之后,求这个数的负数的补码,是简单地把这个数的补码逐位取反再在最低位加1即可得到。例如,[Y]补=101101,则[-Y]补=010011,这大大简化了加减运算所用的线路和加减运算的实现算法。下面的问题是如何检查加减运算中的溢出问题。通常有三种表述方式(说法):   (1)两个符号相同的补码数相加,如果和的符号与加数的符号相反,或两个符号相反的补码数相减,差的符号与减数的符号相同,都属于运算结果溢出。这种判别方法比较复杂,要区别加还是减两种不同运算情况,

  • 在美国当码农是一种怎样的体验?

    1一名美国程序员以自己五分之一的薪资,把自己的工作外包给中国程序员。这样他啥也不干,就完成工作,还年入20万美元…...这事发生在2012年,事情是这样的…主人公是个叫Bob的美国程序员。他40多岁,性格内敛,平时很少说话,几乎没啥存在感。“就是那种你在电梯里碰到,都不会多瞄两眼的人。”Bob在美国的电信公司威讯做了好几年。一直表现很好,代码写的很干净、优秀。“可能是整栋楼里最厉害的程序员。”在上司眼里,Bob是个做事靠谱,为人低调的人才。然而2012年,公司发生了一件怪事。公司的系统,竟然有来自中国的登陆记录。再仔细一查,对方用的是Bob的密钥进入的。因为Bob口碑一直很好,人看着也老实的很,刚开始,调查人员怀疑是黑客冒用了Bob的身份,用恶意软件穿透了公司系统强有力的双重身份验证。但越深入,他们越发现事情没有那简单….查到最后,他们发现,黑客根本就不存在!这一切都是Bob搞的鬼!可能是写代码太累,有一天,他突然“灵机一动”:为啥不让别人帮我上班?我就做中间商,赚差价?于是,他在中国沈阳找了一家编程公司,把自己的工作统统外包给中国的程序员。每天,中国程序员都是按Bob美国的工作时间上

  • 工作汇报(2)

    近期忙个人的事只能利用晚上的时间来写kkitDeploy,周末等休息日全都被安排出去了。公众号也会出现断更的情况希望大家谅解!kkitDeploy算是自己开源的第二个全栈项目,这个项目可能在别人眼里不算什么,但是我还是倾注了足够的心血。kkitDeploy是给我自己的礼物,纪念我这个老IT走过的所有弯路。我会一直维护这个项目的。以后还会对接阿里云,华为云等公有云,k8s,swarm等容器编排工具。vmware,kvm等虚拟化平台,我们还有很多工作要做!每次写shell脚本之后一遍一遍测试效果真的让人抓狂!写到让你发怵!简单跟大家汇报一下kkitDeploy1.0的开发进度。1、底层shell脚本优化改写完成80%,包括先前推出所有一键部署脚本进行了优化改进。 2、增加自动识别yml文件功能,这样以后你们部署yml文件的时候将会非常非常方便。3、增加一个任务超时强行退出功能。 4、websocket完成。正在开发的功能及难点:1、无感知升级,我会不定期扩容脚本池和升级脚本bug。避免使用者频繁更新必须要自动获取源端脚本更新,并且相对及时同步到客户端。难点:脚本池动态更新设计完毕,但是分类

  • 开源C# WPF控件库强力推荐

    点击上方“Dotnet9”添加关注哦开源C#WPF控件库及项目推荐本系列已介绍四款开源C#WPF控件库,其中一款国外的,另三款是国内的,大家如有比较好的开源C#WPF控件库,欢迎向Dotnet9推荐(公众号无留言功能,可在本站留言推荐):1、MaterialDesignInXAML。本站详细介绍网址:https://dotnet9.com/2180.html[1]Github地址:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit[2]看star和fork量,就知道有多优秀了:Github项目情况放上官方Demo截图:控件库Demo该库控件种类繁多,主题也丰富,下面是依据此库开源的一个WPF开源项目《Accelerider.Windows[3]》:开源WPF项目:Accelerider.Windows2、Panuon.UI.Silver本站详细介绍网址:https://dotnet9.com/2285.html[4]Github地址:https://github.com/Panuon/PanuonUI.

  • excel办公小能手,python合并多个EXCEL表的两种方法

    手里头有一份网站关键词数据,当然是来源于工具,站长之家工具的网站查询数据,百度搜索前百名的网站数据,总共96个excel文档数据,至于为什么不是一百个excel文档,答案是有重复网站覆盖了,比如某些大站,比如,百度自身网站,知乎,京东,阿里网站等!需求现在的需求就是将这些文档数据合并为一个excel文档,思路无非就是将这些数据合并为一个文档数据。思路应用python实现的方法有两种,第一种是借助第三方库,xlrd和lsxWriter打开文档读取数据重新写入到一个新excel文档中;第二种方法是使用第三方库,pandas读取所有文档的数据,重新写入到一个新的excel文档当中,其实感觉都是大同小异吧。实现前奏排除干扰网站数据通过判断来排除干扰数据,有干扰的大网站数据defget_excels(self): """ 读取所有excel文件数据,应用if排除干扰网站数据 :return:excel_files """ excel_files=[] excels=os.listdir(self.excel_path) print(le

  • Apache Kafka,Apache Pulsar和RabbitMQ的基准测试:哪一个是最快的MQ?

    ApacheKafka是最流行的事件流处理系统。在这个领域中有很多同类的系统可以拿来比较。但是最关键的一点就是性能。Kafka以速度著称,但是,它现在能有多快,以及与其他系统相比又如何呢?我们决定在最新的云硬件上测试kafka的性能。 为了进行比较,我们选择了传统的消息brokerRabbitMQ和基于ApacheBookeeper的消息brokerApachePulsar。我们要关注以下几点,1.系统吞吐量。2.系统延迟。因为他们是生产中事件流系统的主要性能指标,特别是吞吐量测试测量每个系统在利用硬件(特别是磁盘和CPU)方面的效率。延迟测试测量每个系统交付实时消息的延迟程度,包括高达p99.9%的尾部延迟,这是实时和任务关键型应用程序以及微服务体系结构的关键需求。 我们发现Kafka提供了最好的吞吐量,同时提供了最低的端到端延迟,最高达到p99.9的百分比。在较低的吞吐量下,RabbitMQ以非常低的延迟交付消息。 KafkaPulsarRabbitMQmirroredPeakThroughput(MB/s)605MB/s305MB/s38MB/sp99Latency(ms)5ms

  • MySQL information_schema详解 FILES

    这个专题主要讲information_schema数据库下的一些表如无特殊说明数据库版本为MySQL5.7.261.FILES该表提供存储MySQL表空间数据的文件的信息它提供InnoDB数据文件的信息,如果是NDB,它提供了有关存储了NDB集群磁盘数据表的文件的信息。对于开启了innodb_file_per_table参数,则每个表对应一个表空间,即一个数据文件 此时系统表空间可以有多个数据文件有如下栏位下面的介绍只是对于InnoDB引擎的描述,对于NDB,请参看最后的链接下面提到的预定义的系统表空间包括系统表空间和临时表空间FILE_ID表空间的IDFILE_NAME数据文件的名称以.idb结尾,其中UNDO表空间以undo.开头,系统表空间以ibdata.开头,临时表空间以ibtmp.开头FILE_TYPE文件的类型,有三种类型,普通文件(TABLESPACE),临时文件(TEMPORARY),UNDO日志文件(UNDOLOG)TABLESPACE_NAME表空间的SQL名称,对于独立表空间来说,innodb_file_per_table_##来命名,##为FILE_IDTABL

  • kali开关防火墙

    首先需要安装ufw管理工具apt-getinstallufw复制关闭防火墙ufwdisable复制开启防火墙ufwenable复制检查防火墙的状态(默认inactive)ufwstatus复制防火墙版本ufwversion复制开放22/TCP端口               ufwallow22/tcp复制开放53端口(tcp/udp)            ufwallow53复制禁止外部访问                  ufwdeny3306复制允许此IP访问所有的本机端口ufwallowfrom192.168.1.100复制查看规则,显示行号             ufwstatusnumbered复制删除第三条规则                ufwdelete3复制禁止对8888端口的访问          ufwdeny8888复制打开来自192.168.0.1的tcp请求的22端口ufwallowprototcpfrom192.168.0.1toanyport22复制

  • Arrays.asList使用指南

    一、java.util.Arrays.asList()的一般用法  List是一种很有用的数据结构,如果需要将一个数组转换为List以便进行更丰富的操作的话,可以这么实现:或  上面这两种形式都是十分常见的:将需要转化的数组作为参数,或者直接把数组元素作为参数,都可以实现转换。二、极易出现的错误及相应的解决方案错误一:将原生数据类型数据的数组作为参数  前面说过,可以将需要转换的数组作为asList方法的参数。假设现在需要转换一个整型数组,那么我们可能会这样写:  上面这段代码的输出结果是什么,会是3吗?如果有人自然而然地写出上面这段代码的话,那么他也一定会以为myList的大小为3。很遗憾,这段代码的输出结果不是3,而是1。如果尝试遍历myList,你会发现得到的元素不是1、2、3中的任意一个,而是一个带有hashCode的对象。为什么会如此?  来看一下asList方法的签名:  注意:参数类型是T,根据官方文档的描述,T是数组元素的class。  如果你对反射技术比较了解的话,那么class的含义想必是不言自明。我们知道任何类型的对象都有一个class属性,这个属性代表了这个类型

  • 学界 |《nature》杂志:我们有义务搞懂我们所创造出来的技术

    AI科技评论按:一个跨学科的研究小组希望创建一个名为「机器行为」的新学科,以了解人工智能将如何对我们的社会、文化、经济与政治造成影响。在《自然》杂志的一篇评论文章中,作者认为人工智能算法的研究需要扩展到计算机科学以外的领域,纳入包括来自物理和社会科学的观点。据了解,有两名CIFAR研究员是这篇论文的共同作者:HugoLarochelle,加拿大CIFARAI主席、机器与大脑学习项目副主任、谷歌大脑研究科学家、Mila成员。 MatthewJackson,斯坦福大学经济学教授,CIFAR机构、组织与增长项目(CIFARInstitutions,Organizations&Growthprogram)研究员、人际网络专家、新书《人际网络》(thehumanNetwork)的作者,该书研究了社会等级与交互的影响。本篇采访经过删减和编辑,以保持全文清晰和简洁。雷锋网AI科技评论将之编译如下。论文链接:https://www.nature.com/articles/s41586-019-1138-y论文摘要:由人工智能驱动的机器越来越多参与到我们的社会、文化、经济和政治的互动调节上。

  • 如何成为一名数据极客?

    对于数据岗位的员工,互联网公司颇有些不同的称谓,像统计工程师、大数据工程师、数据分析师、算法工程师、数据科学家等,每一种之间的技能差距简直是风马牛不相及。但我觉得,数据岗位的需求千变万化,真正能通过数据解决问题的人,不仅要通晓两到三种岗位的技能,而且要深刻理解数据方法论,能将数据玩弄于鼓掌之中,这种人我称之为数据极客。好比武侠小说中的绝顶高手,杀人已不需要用剑,剑意就能杀人于无形。数据极客都需要具备哪些能力?懂数据的人会怎么去思考和解决问题?我想举我自身遇到的4个小例子来说明。懂得创造数据在大部分人的常识里,数据是客观存在的,既不会递增,也不会消减。所有当他们绘制报表、展开分析、构建模型时,很容易遭遇的瓶颈是没有数据,俗话说,巧妇难为无米之炊。真实的状况却是:数据是无穷无尽的,哪怕有时我们与数据之间的距离很远,就像远在天边的繁星,「手可摘星辰」只是一个传说,但经过大气层的折射我们却能时刻感受到它们的光辉。不仅光会折射,数据同样也会折射。举一个小例子:实习生Q跑来问我:「Boss赶着要大厅发言的数据去对付投资人,但是后台碍于发言的数据量级太大,一直都没有保存,无论数据库还是日志系统都没有

  • [编程经验] 利用TensorFlow和argparse模块解析命令行参数

    今天的内容主要包括如何用TensorFlow解析命令行参数和利用Python自带的argparse模块解析命令行参数。我会分别写一个例子,通过这个例子彻底学会如何在程序中解析命令行参数。首先什么是命令行?简单理解一下就是在Windows里面命令行就是我们常说的cmd(CommandProcessor),而在Linux中就是shell。命令行参数就是可以写在命令行中的参数,而怎么让程序知道你在命令行中写了哪些参数,就是命令行参数解析。在Python中,或者说在机器学习中,程序中经常会涉及一些参数的设置,比如学习率,迭代次数等。我们之前在Python入门中提到如何运行Python程序,主要有三种方法。1)利用Python自带的shell,Ctrl+F5运行。2)利用集成的编译器,比如PyCharm,Spyder等,点击run按钮就可以执行程序。3)通过命令行来运行程序。前两种都比较简单,下面举一个如何用命令行来运行程序的栗子。图1是一段已经写好的简单的程序,图2是通过命令行来执行。程序命名为:cmd_run_test.py,然后在程序当前所在的文件夹内打开命名行cmd,输入pythoncm

  • 协议森林11 涅槃 (TCP重新发送)

    TCP协议是一个可靠的协议。它通过重新发送(retransmission)来实现TCP片段传输的可靠性。简单的说,TCP会不断重复发送TCP片段,直到片段被正确接收。TCP片段丢失TCP头部的checksum接收方(receiver)可以通过校验TCP片段头部中checksum区域来检验TCP片段是否出错。我们已经接触过了IP协议详解的checksum算法。TCP片段的checksum算法与之类似。IP协议的checksum只校验头部,TCP片段头部的checksum会校验包括IP头部、TCP头部和TCP数据在内的整个序列,确保IP地址、端口号和其他相关信息正确。如果TCP片段出错,接收方可以简单的丢弃改TCP片段,也就相当于TCP片段丢失。TCP片段包裹在一个IP包中传输。IP包可能在网络中丢失。导致IP包丢失的原因可能有很多,比如IP包经过太多的路由器接力,达到hoplimit;比如路由器太过拥挤,导致一些IP包被丢弃;再比如路由表(routingtable)没有及时更新,导致IP包无法送达目的地。下面我们要介绍两种重新发送TCP片段的机制:超时重新发送和快速重新发送。 超时重新发

  • ActiveReports 6:如何升级旧版本的项目

    ActiveReportsfor.NET6.0是报表控件ActiveReports的最新版本,在丰富报表设计功能的同时,还增加了VisualStudio2010支持、Flash报表浏览器、水晶报表文件转换、PDF文件输出、可再分发的最终用户报表设计器等一系列新特性。如果现有的项目基于ActiveReports的旧版本开发,但现在希望使用ActitveReportsfor.NET6.0的新功能,就需要把现有的项目升级到6.0上。ActiveReports6.0提供了一些方便的工具和方法帮助现有用户平滑升级。升级ActiveReportsfor.NET3.0项目如果现在的项目使用的是ActiveReportsfor.NET3.0,那么有两种升级方式:一是使用ActiveReports6.0附带的转换工具(参见下面“升级ActiveReportsfor.NET1.0或2.0项目”);二是在VisualStudio中打开工程,用新版本的DLL替换掉旧版本的DLL引用,并且修改代码的编译错误。替换工程的DLL引用在VisualStudio中打开需要升级的报表工程。在解决方案资源管理器中,点击“显

  • C语言基础概念相关知识总结【C语言学习笔记】

    最近在学习C语言哈,还是零基础的,刚好就把学到的知识写一写记一记,在加深记忆的同时把博客的水也给填一填。这篇文章主要记一些C语言的基础概念性问题,并且后续有新学到的还会补充!C语言基础概念相关知识:计算机程序:一组计算机能识别和执行的指令。机器语言:由0和1组成的计算机可以识别的指令。例:0100010100011000符号语言:也称为汇编语言,在不同计算机之间是不通用的,非常依赖硬件。高级语言:很接近人勒的语言来完成计算机程序设计。FORTRAN语言:(第一个高级语言)C语言/C++语言/JAVA语言,接近人类,并且不依赖机器。C语言--->编译程序--->机器语言非机构化语言(basic)-->结构化语言(C语言)-->面向对象语言(java/c++/PHP/python等)C语言的标准:C89和C99(C99为当前流行使用标准)C语言的特点:面向过程的语言,开发应用程序和操作系统程序。C语言必须的头文件:stdio:标准输入输出函数库inputoutputmain:(主)函数(function)程序的入口int:整数类型printf:输出内容#includ

  • 倒计时2日!基于 Apache DolphinScheduler&amp;TiDB 的交叉开发实践,从编写到调度让你大幅提升效率

    当大数据挖掘成为企业赖以生存、发展乃至转型的生命,如何找到一款好软件帮助企业满足需求,成为了许多大数据工程师困扰的问题。但在当下高速发展的大数据领域,光是一款好软件似乎都不足以满足所有场景业务需求,许多企业逐渐将目光转向了技术生态的“外延”——即结合各种场景打造企业适用的技术架构。 那该如何才能打造出一款,用户能够“轻松上手”、“简单应用”的软件呢?ApacheDolphinScheduler联合TiDB社区共同举办的Meetup将带给你答案!本周六下午两点,社区也有幸邀请到了数位来自阿里云、国内跨境电商巨头SHEIN、TiDB社区等企业的资深大数据工程师与开发者。他们将从数据仓库、数据调度、应用开发、技术外延等话题探讨ApacheDolphinScheduler与TiDB两个开源项目的开发实践。 无论你是ApacheDolphinScheduler&TiDB的开发工程师还是个人爱好者,来到本次Meetup,相信一定可以解答你的所有疑惑。 报名通道 ApacheDolphinScheduler&TiDB联合Meetup|6月线上直播报名通道已开启,赶快预约吧! 时间

  • Spring Boot中使用JUnit5进行单元测试

    SpringBoot学了这么久,我还没用过它的单元测试。今天我就系统完整地学习总结一下在SpringBoot中使用JUnit5框架进行单元测试。其实本节主要还是学习JUnit5的使用。有一句话说的好,我可以不用,但我必须会用。 1.JUnit5的变化2.JUnit5的常用注解3.断言机制4.前置条件(assumptions)5.嵌套测试6.参数化测试1.JUnit5的变化SpringBoot2.2.0版本开始引入JUnit5作为单元测试默认库。作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成(JUnit5=JUnitPlatform+JUnitJupiter+JUnitVintage)。JUnitPlatform:JunitPlatform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。 JUnitJupiter:JUnitJupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在JunitPlatform上运行。 JUnitV

  • Win7下的内置FTP组件的设置详解

    本文摘自:https://www.cnblogs.com/grenet/archive/2012/05/04/2480682.html 在局域网中共享文件,FTP是比较方便的方案之一。Win7内部集成了FTP,只是设置起来颇费一番功夫。着文以记之。   一、安装FTP组件     由于Win7默认没有安装FTP组件。故FTP的设置第一步就是安装FTP组件     点击:控制面板—》程序和功能—》打开或关闭Windows功能。勾选“FTP服务器”及“FTP服务”“FTP扩展性”,点击“确定”,安装FTP组件。如下图所示        二、添加FTP站点     点击:控制面板—》管理工具。选中“Internet信息服务(IIS)管理器”,如图          双击“Internet信息服务(IIS)管理器”。弹出管理器界面,如下图所示:          单击选中“网站”,并且在其上右击,选择“添加FTP站点”,出现“站点信息”界面,如下所示:          给FTP取名(本例是:zhu),以及设置FTP站点的物理路径(本例是:c:\ftp),点击“下一步”,出现“绑定和SSL设置

  • Android启动原理剖析【转】

    我们知道Android是以一个Activity为单位的,但是我们并没有看到一个Activity是怎么开始启动的。今天我们就从Android的源代码开始讲吧。 ActivityThread: Android的一个apk在打开时,使用到的第一个类就是这个类。我们先来说这个类。等说完这个类就能了解Android应用程序的启动原理了。这货名字取名有一个Thread结尾,貌似是一个线程类。其实他并不是一个线程类,这个类没有继承任何类。或者说是直接继承在Object类。我们来看ActivityThread publicfinalclassActivityThread{ .... }复制 这是ActivityThread定义时候的的源码,可以看出他根本没有继承任何类。那他为什么要以Thread来结尾的。貌似很不合理。其实不然。想必大家应该Android的异步线程机制吧。其实ActivityThread在创建的时候同时也启动了一个线程,这个线程就是一个异步线程,他创建出了MessageQueue,并同时进行消息的轮询,因此当这个应用程序在运行时,这个线程是一直都在的。这个线程就是应用程序的主线程,

  • python在cmd运行自己的模块报错问题及解决

    找到本地库的路径,然后将文件拷进去即可 拷贝到\Lib\site-packages中 PyCharm中是不会报错而且执行成功 cmd命令中执行成功 四、手动给python添加搜索路径 在python安装目录的\Lib\site-packages文件夹中建立一个.pth文件,内容为自己写的库绝对路径 这个时候PyCharm中是会报错的,但是执行是成功的 cmd命令是执行成功的。 还有一种方法导入完整路径: 将根目录设为搜索路径 这时候不管在PyCharm还是cmd执行都是成功的 所以对于处于不同一文件夹下的情况:先手动给python添加搜索路径(根目录),然后直接导入模块全路径; 幻想毫无价值,计划渺如尘埃,目标不可能达到。这一切的一切毫无意义——除非我们付诸行动。

  • php 错误提示开启

    开发环境项目,通常需要错误提示:php.ini文件,设置display_errors=On项目上线以后,当然不想把错误提示显示。 一般不直接修改php.ini文件,下面两行代码直接加入报错php文件: ini_set("display_errors","On");//打开错误提示 ini_set("error_reporting",E_ALL);//显示所有错误复制   error_reporting错误级别包括: E_ALL-所有错误和警告(包括PHP5.4.0中的E_STRICT) E_ERROR-致命的运行时错误 E_RECOVERABLE_ERROR-几乎致命的运行时错误 E_WARNING-运行时警告(非致命错误) E_PARSE-编译时解析错误 E_NOTICE-运行时通知(这些通常是警告,从您的代码中的错误,但它可能是故意的(例如,使用未初始化的变量和赖于它自动初始化为一个事实空字符串) E_STRICT-运行时通知,允许PHP建议更改您的代码将确保最佳的互操作性,并转发代码的兼容性 E_CORE_ERROR-PHP初始启动期间发生的致命错误 E_CORE

相关推荐

推荐阅读