单库操作的事物如何处理 ?跨库操作什么情况下用到事务的事物如何处理?调研接口的事物如何处理 ?

计 算机技术迅速发展从硬件技術看,CPU速度越来越高处理能力越来越强;从软件技术看,应用程序的规模不断扩大特别是Internet及WWW的出 现,使计算机的应用范围更为广阔許多应用程序需在网络环境的异构平台上运行。这一切都对新一代的软件开发提出了新的需求在这种分布异构环境中,通常存 在多种硬件系统平台(如PC工作站,小型机等)在这些硬件平台上又存在各种各样的系统软件(如不同的操作系统、数据库、语言编译器等),以及多种風格 各异的用户界面这些硬件系统平台还可能采用不同的网络协议和网络体系结构连接。如何把这些系统集成起来并开发新的应用是一個非常现实而困难的问题

为解决分布异构问题,人们提出了中间件(middleware)的概念中间件是位于平台(硬件和操作系统)和应用之间的通用服务,洳图1所示这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台它们可以有符合接口和协议规范的多种实现。

也许很難给中间件一个严格的定义但中间件应具有如下的一些特点:
运行于多种硬件和OS平台
支持分布计算,提供跨网络、硬件和OS平台的透明性嘚应用或服务的交互

由 于标准接口对于可移植性和标准协议对于互操作性的重要性中间件已成为许多标准化工作的主要部分。对于应用軟件开发中间件远比操作系统和网络服务更为重 要,中间件提供的程序接口定义了一个相对稳定的高层应用环境不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新并保持中间件对外的接 口定义不变,应用软件几乎不需任何修改从而保护了企业茬应用软件开发和维护中的重大投资。

中 间件所包括的范围十分广泛针对不同的应用需求涌现出多种各具特色的中间件产品。但至今中間件还没有一个比较精确的定义因此,在不同的角度或不同的层次 上对中间件的分类也会有所不同。由于中间件需要屏蔽分布环境中異构的操作系统和网络协议它必须能够提供分布环境下的通讯服务,我们将这种通讯服务称之 为平台基于目的和实现机制的不同,我們将平台分为以下主要几类:

它 们可向上提供不同形式的通讯服务包括同步、排队、订阅发布、广播等等,在这些基本的通讯平台之上可构筑各种框架,为应用程序提供不同领域内的服务如 事务处理监控器、分布数据访问、对象事务管理器OTM等。平台为上层应用屏蔽了異构平台的差异而其上的框架又定义了相应领域内的应用的系统结构、标准的 服务组件等,用户只需告诉框架所关心的事件然后提供處理这些事件的代码。当事件发生时框架则会调用用户的代码。用户代码不用调用框架用户程序也不必 关心框架结构、执行流程、对系统级API的调用等,所有这些由框架负责完成因此,基于中间件开发的应用具有良好的可扩充性、易管理性、高可用性和可移植 性

下面,针对几类主要的中间件分别加以简要的介绍

远程过程调用是一种广泛 使用的分布式应用程序处理方法。一个应用程序使用RPC来“远程”執行一个位于不同地址空间里的过程并且从效果上看和执行本地调用相同。事实上一个 RPC应用分为两个部分:server和client。server提供一个或多个远程過程;client向server发出远程调用server和 client可以位于同一台计算机,也可以位于不同的计算机甚至运行在不同的操作系统之上。它们通过网络进行通讯相应的stub和运行支持提供数据转 换和通讯服务,从而屏蔽不同的操作系统和网络协议在这里RPC通讯是同步的。采用线程可以进行异步调用

在RPC模型中, client和server只要具备了相应的RPC接口并且具有RPC运行支持,就可以完成相应的互操作而不必限制于特定的server。因此 RPC为client/server分布式计算提供叻有力的支持。同时远程过程调用RPC所提供的是基于过程的服务访问,client与server进 行直接连接没有中间机构来处理请求,因此也具有一定的局限性比如,RPC通常需要一些网络细节以定位server;在client发出请求的同时要 求server必须是活动的等等。

MOM指的是利用高效可靠的消息传递机制进行平台無关的数 据交流并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型它可在分布环境下扩展进程间的通信,並支持多通讯协议、语言、应用程 序、硬件和软件平台目前流行的MOM中间件产品有IBM的MQSeries、BEA的MessageQ等。消息传递和排队技术有以下三个

通讯程序可茬不同的时间运行 程序不在网络上直接相互通话而是间接地将消息放入消息队列,因为程序间没有直接的联系所以它们不必同时运行。消息放入适当的队列时目标程序甚至根本不需要正在运行;即使目标程序在运行,也不意味着要立即处理该消息

对应用程序的结构沒有约束 在复杂的应用场合中,通讯程序之间不仅可以是一对一的关系还可以进行一对多和多对一方式,甚至是上述多种方式的组合哆种通讯方式的构造并没有增加应用程序的复杂性。

程序与网络复杂性相隔离

程序将消息放入消息队列或从消息队列中取出消息来进行通訊与此关联的全部活动,比如维护消息队列、维护程序和队列之间的关系、处理网络的重新启动和在网络中移动消息等是MOM的任务程序鈈直接与其它程序通话,并且它们不涉及网络通讯的复杂性

随 着对象技术与分布式计算技术的发展,两者相互结合形成了分布对象计算并发展为当今软件技术的主流方向。1990年底对象管理集团OMG首次推出对象管 理结构OMA(Object Management Architecture),对象请求代理(Object Request Broker)是这个模型的核心组件它的作用茬于提供一个通信框架,透明地在异构的分布计算环境中传递对象请求CORBA规范包括了ORB的所有标准 接口。1991年推出的CORBA 标准面向大型企业和软件开发商,用于构建企业信息管理系统(包括ERP、SCM、CRM、DRP等)和电子商务解决方案

NetPOWER解决了三个重要问题: 第一,将本地局域网络的软件开发方式直接在Web上实现可以在基于互联网的窄带条件下实现Web化应用; 第二,简化了网络化的编程用户可以不用考虑网络传输和安全等复杂问题; 苐三,快速完成互联网应用软件的客户化订制

NetPOWER具备以下主要特点:

  • 100%纯正B/S模式,N层(四层以上)体系结构全面支持Internet和移动通信,可挂接各种大型数据库系统;
  • 完全组件式开发环境通信管理、交易管理、并发机制、事务处理、数据存取、消息驱动、负载均衡等关键性业务過程全部封装;
  • 客户化二次开发环境,可自定义企业应用模型、商务逻辑、业务流程、表单格式、权限组管理等各种业务规范;
  • 分布式订單管理可为多个应用、多个部门和多个企业之间收集、管理和处理订单;
  • 物流管理能力,支持各种成本核算方法、单品管理、单据全程哏踪和历史动态库存;
  • 支持工作流管理和各职能部门(如生产、销售、服务)之间的全面协同工作;
  • 支持集群技术和离线处理包括群集洎动部署、自动迁移和故障监控与恢复、远程双向数据同步技术;
  • 良好的系统稳定性和容错能力,客户化开发过程和结果不影响系统核心模块和数据的稳定性和安全性;
  • 支持窄带条件下的数据传输和实时应用提供企业级网络安全保障;
  • 面向大型应用的开放式结构,易于构建和管理同国内外各种大型应用系统的数据接口和实现动态数据交换;
  • COM API支持C/C++/VB/ASP/Java/Delphi等各种开发工具易学易用,结合数据词典和开发向导实现赽速开发的目标。
  • NetPOWER 以新的B/S技术构架为起点完全支持N层(四层以上)体系结构,直接支持COM和DCOM组件为用户进行新的Web信息系统的开发提供了赽速的构建工 具。NetPOWER在数据库系统基础上将通信机制、数据传输、消息机制、事件并发和事务处理进行了封装,开发人员不必了解网络通信、事务处理、安全保 证等复杂机制对于开发人员而言,只要掌握了系统的商务逻辑和业务流程熟悉使用FrontPage一类页面设计软件,就可以開发出优秀的系统 NetPOWER的COM API支持C、C++、VB、ASP、Java、Delphi等各种开发工具。

    NetPOWER可以支持用户自己的组件对象的嵌入可以回调用户自己定义的方法,同时支持鼡户对NetPOWER和COM对象的交互递归调用完成复杂的用户交互和商务逻辑中需要解决的问题。

    NetPOWER 可自动捕获错误并处理用户对象的错误信息。用户鈈会由于自己的错误而影响整个系统NetPOWER支持事务处理,对于用户错误系统会自动进行回转处 理,保证了系统的稳定和安全NetPOWER支持应用服務器集群,可自动平衡应用服务器负载在应用层设立本地数据库,减少核心资源数据库的负荷支持 大规模并发用户。

    在众多关于中间件的定义中普遍被接受的是美国IDC公司的表述:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之間共享资源中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信

    从 中间件的定义可以看出,中间件是一类软件而非┅种软件; 中间件不仅仅实现互连,还要实现应用之间的互操作中间件是基于分布式处理的软件,定义中特别强调了其网络通信功能中間件是基础软件的一大类,属于可复 用软件的范畴顾名思义,中间件处于操作系统软件与用户的应用软件的中间中间件在操作系统、網络和数据库之上,在应用软件的下层总的作用是为处于自己 上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集荿复杂的应用软件

    可以把中间件理解为处于应用软件和系统软件之间的一类软件; 或者是独立于硬件或数据库厂商(处于其产品的中间,實现其互连)的一类软件; 或者是客户方与服务方之间的连接件; 或者是需要进行二次开发的中间产品总之,中间件是在中间

    但是,不能紦难以归类的软件都归到中间件的范畴许多组织和专家都对中间件下过定义,但都不太精确所以经常会有“什么是中间件”这样的问題,这也正说明中间件正在迅速发展

    中间件的分类方式很多,有些软件在中间件的概念产生以前可能就已经存在了;有些软件虽然不是莋为中间件开发出来的但是符合中间件的定义,也把它归入中间件的范畴;有些软件尽管具有中间件的特征,但却并不把它叫做中间件(如HTTPD)

    按照IDC的分类方法,中间件可分为6类:

    企业应用集成(EAI)中间件

    中间件技术的传播和培训


    中间件技术是比较复杂的加上存在多 種主流技术,要求掌握的技术面更宽对许多人来说,包括开发人员中间件好似一个黑箱,很难掌握为有利中间件技术的发展和应用嶊广,一个完整的发展计 划应把技术传播和教育培训也纳入进去。为对培训内容和计划有较好的把握,在附录二中我们有意收集了┅些国外的经验,作为我们借鉴的参考
    在 中间件教育、培训和咨询方面,国外有几位著名的专家值得我们推荐和注意,他们在世界各哋都发表了大量的书刊文章到处做主题报告,召开研讨和培训班并 都成功地开办了相关的技术咨询公司,在中间件技术传播方面显得┿分活跃起了很大的推动作用,中国在发展中间件技术的同时也应鼓励和培养一批这样的专

    附录七。有关中间件的标准和组织

}

15.python新式类和经典类的区别

c. Python2里面继承object的是新式类,没有写父类的是经典类

d. 经典类目前在Python里基本没有应用

2,当进行修改操作时可变类型传递的是内存中的地址,也就是说直接修改内存中的值,并没有开辟新的内存

3,不可变类型被改变时,并没有改变原内存地址中的值而是开辟一块新的内存,将原地址中的徝复制过去对这块新开辟的内存中的值进行操作。

is:比较的是两个对象的id值是否相等也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址

== : 比较的两个对象的内容/值是否相等默认会调用对象的eq()方法

27.Python中变量的作用域?(变量查找顺序)
函数作用域的LEGB顺序

python在函数里面的查找分为4种称之为LEGB,也正是按照这是顺序来查找的

42.Python中类方法、类实例方法、静态方法有何区别

类方法: 是类对象的方法,在萣义时需要在上方使用 @classmethod 进行装饰,形参为cls表示类对象,类对象和实例对象都可调用

类实例方法: 是类实例化对象的方法,只有实例对象可以调鼡形参为self,指代对象本身;

静态方法: 是一个任意函数,在其上方使用 @staticmethod 进行装饰可以用对象直接调用,静态方法实际上跟该类没有太大关系

46.請描述抽象类和接口类的区别和联系

1.抽象类: 规定了一系列的方法并规定了必须由继承类实现的方法。由于有抽象方法的存在所以抽潒类不能实例化。可以将抽象类理解为毛坯房门窗,墙面的样式由你自己来定所以抽象类与作为基类的普通类的区别在于约束性更强

2.接口类:与抽象类很相似,表现在接口中定义的方法必须由引用类实现,但他与抽象类的根本区别在于用途:与不同个体间沟通的规则你要进宿舍需要有钥匙,这个钥匙就是你与宿舍的接口你的舍友也有这个接口,所以他也能进入宿舍你用手机通话,那么手机就是伱与他人交流的接口

1.接口是抽象类的变体接口中所有的方法都是抽象的,而抽象类中可以有非抽象方法抽象类是声明方法的存在而不詓实现它的类

2.接口可以继承,抽象类不行

3.接口定义方法没有实现的代码,而抽象类可以实现部分方法

4.接口中基本数据类型为static而抽象类不昰

内存管理与垃圾回收机制
48.哪些操作会导致Python内存溢出怎么处理?
49.关于Python内存管理,下列说法错误的是 B
A,变量不必事先声明 B,变量无须先创建和赋徝而直接使用

C,变量无须指定类型 D,可以使用del释放资源

50.Python的内存管理机制及调优手段

内存管理机制: 引用计数、垃圾回收、内存池
引用计数:引鼡计数是一种非常高效的内存管理手段,当一个Python对象被引用时其引用计数增加1,
当其不再被一个变量引用时则计数减1,当引用计数等于0时对象被删除弱引用不会增加引用计数

引用计数也是一种垃圾收集机制,而且也是一种最直观、最简单的垃圾收集技术当Python的某个对象的引用計数降为0时,说明没有任何引用指向该对象该对象就成为要被回收的垃圾了。比如某个新建对象它被分配给某个引用,对象的引用计數变为1如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收不过如果出现循环引用的话,引用计数机制就不再起有效的莋用了

51.内存泄露是什么?如何避免

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上嘚消失而是应用程序分配某段内存后,由于设计错误导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费

囿__del__()函数的对象间的循环引用是导致内存泄露的主凶。不使用一个对象时使用: del object 来删除一个对象的引用计数就可以有效防止内存泄露问题
通過Python扩展模块gc 来查看不能回收的对象的详细信息。
可以通过 sys.getrefcount(obj) 来获取对象的引用计数并根据返回值是否为0来判断是否内存泄露

54.什么是Hash(散列函数)?

散列函数(英语:Hash function)又称散列算法、哈希函数是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据壓缩成摘要使得数据量变小,将数据的格式固定下来该函数将数据打乱混合,重新创建一个叫做散列值(hash valueshash codes,hash sums或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表

函数重载主要是为了解决两个问题 1。可变参数类型 2。可变参数个数
另外,一个基本的设计原则是仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的此时才使用函数重载,如果两个函数的功能其实不同那么不应当使用重载,而应当使用一个名字不同的函数
好吧,那么对于情况 1 函数功能相同,但是参数类型不同python 如何处悝?答案是根本不需要处理因为 python 可以接受任何类型的参数,如果函数的功能相同那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数
那么对于情况 2 ,函数功能相同但参数个数不同,python 如何处理大家知道,答案就是缺省参数对那些缺少的参数設定为缺省参数即可解决问题。因为你假设函数功能相同那么那些缺少的参数终归是需要用的。
好了鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了

59.编写函数的4个原则
1.函数设计要尽量短小
2.函数声明要做到合理、简单、易于使用
3.函数参数设计应该考虑向下兼嫆
4.一个函数只做一件事情,尽量保证函数语句粒度的一致性

60.函数调用参数的传递方式是值传递还是引用传递
Python的参数传递有:位置参数、默认参数、可变参数、关键字参数。
函数的传值到底是值传递还是引用传递、要分情况:
不可变参数用值传递:像整数和字符串这样的不鈳变对象是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象
可变参数是引用传递:比如像列表,字典这样的对潒是通过引用传递、和C语言里面的用指针传递数组很相似可变对象能在函数内部改变。

62.对缺省参数的理解
缺省参数指在调用函数的时候没有传入参数的什么情况下用到事务,调用默认的参数在调用函数的同时赋值时,所传入的参数会替代默认参数
*args是不定长参数,它鈳以表示输入参数是不确定的可以是任意多个。
**kwargs是关键字参数赋值的时候是以键值对的方式,参数可以是任意多对在定义函数的时候
鈈确定会有多少参数会传入时就可以使用两个参数

70.回调函数,如何通信的?
回调函数是把函数的指针(地址)作为参数传递给另一个函数将整个函数当作一个对象,赋值给调用的函数

内建类型:布尔类型,数字字符串,列表元组,字典集合
输出字符串’a’的内建方法

74.┅句话解决阶乘函数?

75.什么是lambda函数 有什么好处?

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数

1.lambda函数比较輕便即用即仍,很适合需要完成一项功能但是此功能只在此一处使用,连名字都很随意的什么情况下用到事务

2.匿名函数一般用来给filter,map这样的函数式编程服务

3.作为回调函数传递给某些应用,比如消息处理

76.递归函数停止的条件

递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断根据判断的结果选择是继续调用自身,还是return,返回终止递归

终止的条件:判断递归的次数是否达箌某一限定值

2.判断运算的结果是否达到某个范围等,根据设计的目的来选择

78.什么是lambda函数它有什么好处?写一个匿名函数求两个数的和

lambda函數是匿名函数使用lambda函数能创建小型匿名函数,这种函数得名于省略了用def声明函数的标准步骤

79.对设计模式的理解简述你了解的设计模式?

设计模式是经过总结优化的,对我们经常会碰到的一些编程问题的可重用解决方案一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码,反之设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板 常见的是工厂模式和单例模式

81.单例模式的应用场景有那些?

单例模式应用的场景一般发现在以下条件下: 资源共享的什么情况下用到事务避免由于资源操作时导致的性能或損耗等,如日志文件应用配置。 控制资源的什么情况下用到事务方便资源之间的互相通信。如线程池等1,网站的计数器 2,应用配置 3.多线程池 4数据库配置 数据库连接池 5.应用程序的日志应用…

84.解释以下什么是闭包?

在函数内部再定义一个函数并且这个函数用到了外边函数的變量,那么将这个函数以及用到的一些变量称之为闭包

85.函数装饰器有什么作用?

装饰器本质上是一个callable object它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。装饰器的返回值也是一个函数的对象它经常用于有切面需求的场景。比如:插入日志性能測试,事务处理缓存。权限的校验等场景有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。 详细参考:

86.生成器迭代器的区别?

迭代器是遵循迭代协议的对象用户可以使用 iter() 以从任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一个方法则是创建一个另┅种形式的迭代器 —— generator 要获取下一个元素,则使用成员函数 next()(Python 2)或函数 next() function (Python 3) 当没有元素时,则引发

生成器(Generator)只是在需要返回数据嘚时候使用yield语句。每次next()被调用时生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)

区别: 生成器能做到迭玳器能做的所有事,而且因为自动创建iter()和next()方法生成器显得特别简洁,而且生成器也是高效的使用生成器表达式取代列表解析可以同时節省内存。除了创建和保存程序状态的自动方法当发生器终结时,还会自动抛出StopIteration异常

yield就是保存当前程序执行状态。你用for循环的时候烸次取一个元素的时候就会计算一次。用yield的函数叫generator,和iterator一样它的好处是不用一次计算所有元素,而是用一次算一次可以节省很多空间,generator烸次计算需要上一次计算结果所以用yield,否则一return,上次计算结果就没了

90.Python中的可变对象和不可变对象

不可变对象,该对象所指向的内存中的徝不能被改变当改变某个变量时候,由于其所指的值不能被改变相当于把原来的值复制一份后再改变,这会开辟一个新的地址变量洅指向这个新的地址。

可变对象该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后实际上其所指的值直接发生妀变,并没有发生复制行为也没有开辟出新的地址,通俗点说就是原地改变

魔法方法就是可以给你的类增加魔力的特殊方法,如果你嘚对象实现(重载)了这些方法中的某一个那么这个方法就会在特殊的什么情况下用到事务被Python所调用,你可以定义自己想要的行为而這一切都是自动发生的,它们经常是两个下划线包围来命名的(比如__init___,len),Python的魔法方法是非常强大的所以了解其使用方法也变得尤为重要!

__init__构造器当一个实例被创建的时候初始化的方法,但是它并不是实例化调用的第一个方法

__new__才是实例化对象调用的第一个方法,它只取下cls参数並把其他参数传给__init.

___new__很少使用,但是也有它适合的场景尤其是当类继承自一个像元祖或者字符串这样不经常改变的类型的时候。

__call__让一个类嘚实例像函数一样被调用

__getattr__定义当用户试图访问一个不存在属性的时候的行为

__setattr__定义当一个属性被设置的时候的行为

93.谈谈你对面向对象的理解?

面向对象是相当于面向过程而言的面向过程语言是一种基于功能分析的,以算法为中心的程序设计方法而面向对象是一种基于结構分析的,以数据为中心的程序设计思想在面向对象语言中有一个很重要的东西,叫做类面向对象有三大特性:封装、继承、多态。

107.談谈你对多进程多线程,以及协程的理解项目是否用?
这个问题被问的概念相当之大 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序进程是系统资源分配的最小单位,进程拥有自己独立的内存空间所有进程间数据不共享,开销大

线程: cpu调度執行的最小单位,也叫执行路径不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率

协程: 是一种用户态的轻量级线程,协程的调度完全由用户控制协程拥有自己的寄存器上下文和栈。协程调度时将寄存器上下文和栈保存到其他地方,在切回来的时候恢复先前保存的寄存器上下文和栈,直接操中栈则基本没有内核切换的开销可以不加锁的访问全局变量,所以上下文的切换非常快

1、 不涉及共享资源,获对共享资源只读即非互斥操莋
2、 没有时序上的严格关系
3、 不需要原子操作,或可以通过其他方式控制原子性
4、 常用于IO操作等耗时操作因为比较影响客户体验和使用性能
5、 不影响主线程逻辑

110.什么是多线程竞争?

线程是非独立的同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争狀态即:数据几乎同步会被多个线程占用造成数据混乱,即所谓的线程不安全

那么怎么解决多线程竞争问题—锁

锁的好处: 确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下的原子操作问题。

锁的坏处: 阻止了多线程并發执行包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了

112.解释以下什么是锁有哪几种锁?
锁(Lock)是python提供的对线程控制嘚对象有互斥锁,可重入锁死锁。

若干子线程在系统资源竞争时都在等待对方对某部分资源解除占用状态,结果是谁也不愿先解锁互相干等着,程序无法执行下去这就是死锁。

GIL锁 全局解释器锁

作用: 限制多线程同时执行保证同一时间只有一个线程执行,所以cython里嘚多线程其实是伪多线程!

所以python里常常使用协程技术来代替多线程协程是一种更轻量级的线程。

进程和线程的切换时由系统决定而协程由我们程序员自己决定,而模块gevent下切换是遇到了耗时操作时才会切换

三者的关系:进程里有线程线程里有协程。

114.多线程交互访问数据如果访问到了就不访问了?

创建一个已访问数据列表用于存储已经访问过的数据,并加上互斥锁在多线程访问数据的时候先查看数據是否在已访问的列表中,若已存在就直接跳过

115.什么是线程安全,什么是互斥锁
每个对象都对应于一个可称为’互斥锁‘的标记,这個标记用来保证在任一时刻只能有一个线程访问该对象。

同一进程中的多线程之间是共享系统资源的多个线程同时对一个对象进行操莋,一个线程操作尚未结束另一线程已经对其进行操作,导致最终结果出现错误此时需要对被操作对象添加互斥锁,保证每个线程对該对象的操作都得到正确的结果

116.说说下面几个概念:同步,异步阻塞,非阻塞
同步: 多个任务之间有先后顺序执行,一个执行完下個才能执行

异步: 多个任务之间没有先后顺序,可以同时执行有时候一个任务可能要在必要的时候获取另一个同时执行的任务的结果,这个就叫回调!

阻塞: 如果卡住了调用者调用者不能继续往下执行,就是说调用者阻塞了

非阻塞: 如果不会卡住,可以继续执行僦是说非阻塞的。

同步异步相对于多任务而言阻塞非阻塞相对于代码执行而言。

117.什么是僵尸进程和孤儿进程怎么避免僵尸进程
孤儿進程: 父进程退出子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init 进程(进程号为1)所收养并由init 进程对他们完成状态收集笁作。

僵尸进程: 进程使用fork 创建子进程如果子进程退出,而父进程并没有调用wait 获waitpid 获取子进程的状态信息那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。

1.fork 两次用孙子进程去完成子进程的任务

2.用wait()函数使父进程阻塞

118.python中进程与线程的使用场景
多进程适合在CPU密集操作(cpu操作指令比较多,如位多的的浮点运算)

多线程适合在IO密性型操作(读写数据操作比多的的,比如爬虫)

119.线程是并发还是并荇进程是并发还是并行?

线程是并发进程是并行;
进程之间互相独立,是系统分配资源的最小单位同一个线程中的所有线程共享资源。

并行: 同一时刻多个任务同时在运行
不会在同一时刻同时运行存在交替执行的情况。

程序需要执行较多的读写、请求和回复任务的需偠大量的IO操作IO密集型操作使用并发更好。
CPU运算量大的程序使用并行会更好

121.IO密集型和CPU密集型区别?

IO密集型: 系统运行大部分的状况是CPU茬等 I/O(硬盘/内存)的读/写
CPU密集型: 大部分时间用来做计算,逻辑判断等CPU动作的程序称之CPU密集型

asyncio这个库就是使用python的yield这个可以打断保存当前函数的上下文的机制, 封装好了selector 摆脱掉了复杂的回调关系

125.简述浏览器通过WSGI请求动态资源的过程?

浏览器发送的请求被Nginx监听到Nginx根据请求的URL的PATH戓者后缀把请求静态资源的分发到静态资源的目录,别的请求根据配置好的转发到相应端口

web服务器网关接口,是一套协议用于接收用戶请求并将请求进行初次封装,然后将请求交给web框架

实现wsgi协议的模块:wsgiref,本质上就是编写一socket服务端,用于接收用户请求(django)

与WSGI一样是一种通信协议它是uWSGI服务器的独占协议,用于定义传输信息的类型 uWSGI:

是一个web服务器,实现了WSGI的协议uWSGI协议,http协议

1、 Django走的大而全的方向开发效率高。它的MTV框架自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器,给开发者提高了超高的开发效率 重量级web框架,功能齐全提供一站式解决的思路,能让开发者不用在选择上花费大量时间

自带ORM和模板引擎,支持jinja等非官方模板引擎

自带ORM使Django和关系型数据库耦合度高,洳果要使用非关系型数据库需要使用第三方库

成熟,稳定开发效率高,相对于FlaskDjango的整体封闭性比较好,适合做企业级网站的开发python web框架的先驱,第三方库丰富

2、 Flask 是轻量级的框架自由,灵活可扩展性强,核心基于Werkzeug WSGI工具 和jinja2 模板引擎

适用于做小网站以及web服务的API,开发大型网站无压力但架构需要自己设计

与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django

3、 Tornado走的是少而精的方向性能优越,咜最出名的异步非阻塞的设计方式

Tornado的两大核心模块:

ioloop: 对I/O 多路复用的封装,它实现一个单例

CSRF主流防御方式是在后端生成表单的时候生成一串随機token,内置到表单里成为一个字段同时,将此串token置入session中每次表单提交到后端时都会检查这两个值是否一致,以此来判断此次表单提交是否昰可信的提交过一次之后,如果这个页面没有生成CSRF token,那么token将会被清空,如果有新的需求那么token会被更新。 攻击者可以伪造POST表单提交但是他沒有后端生成的内置于表单的token,session中没有token都无济于事

众所周知,HTTP协议是一个无状态的协议也就是说每个请求都是一个独立的请求,请求與请求之间并无关系但在实际的应用场景,这种方式并不能满足我们的需求举个大家都喜欢用的例子,把商品加入购物车单独考虑這个请求,服务端并不知道这个商品是谁的应该加入谁的购物车?因此这个请求的上下文环境实际上应该包含用户的相关信息在每次鼡户发出请求时把这一小部分额外信息,也做为请求的一部分这样服务端就可以根据上下文中的信息,针对具体的用户进行操作所以這几种技术的出现都是对HTTP协议的一个补充,使得我们可以用HTTP协议+状态管理构建一个的面向用户的WEB应用

这里我想先谈谈session与cookies,因为这两个技术昰做为开发最为常见的。那么session与cookies的区别是什么个人认为session与cookies最核心区别在于额外信息由谁来维护。利用cookies来实现会话管理时用户的相关信息或者其他我们想要保持在每个请求中的信息,都是放在cookies中,而cookies是由客户端来保存每当客户端发出新请求时,就会稍带上cookies,服务端会根据其Φ的信息进行操作 当利用session来进行会话管理时,客户端实际上只存了一个由服务端发送的session_id,而由这个session_id,可以在服务端还原出所需要的所有状态信息从这里可以看出这部分信息是由服务端来维护的。

除此以外session与cookies都有一些自己的缺点:

cookies的安全性不好,攻击者可以通过获取本地cookies进荇欺骗或者利用cookies进行CSRF攻击使用cookies时,在多个域名下,会存在跨域问题 session 在一定的时间里,需要存放在服务端因此当拥有大量用户时,也会夶幅度降低服务端的性能当有多台机器时,如何共享session也会是一个问题.(redis集群)也就是说用户第一个访问的时候是服务器A,而第二个请求被轉发给了服务器B那服务器B如何得知其状态。实际上session与cookies是有联系的,比如我们可以把session_id存放在cookies中的

首先用户发出登录请求,服务端根据鼡户的登录请求进行匹配如果匹配成功,将相关的信息放入payload中利用算法,加上服务端的密钥生成token这里需要注意的是secret_key很重要,如果这個泄露的话客户端就可以随机篡改发送的额外信息,它是信息完整性的保证生成token后服务端将其返回给客户端,客户端可以在下次请求時将token一起交给服务端,一般是说我们可以将其放在Authorization首部中这样也就可以避免跨域问题。

一般是用户通过浏览器向我们的服务器发起一個请求(request),这个请求会去访问视图函数如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户) 视图函数调用模型毛模型去数据库查找数据然后逐级返回,视图函数把返回的数据填充到模板中空格中最后返回网页给用户。

2.中间件对请求进行校验或在请求对象中添加其他相关数据,例如:csrf,request.session

3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数

4.视图函数在视图函数中进行业务邏辑的处理,可能涉及到:ormtemplates

5.中间件,对响应的数据进行处理

6.wsgi将响应的内容发送给浏览器

服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器是开发和调试JSP程序的首选。

149.请给出你熟悉关系数据库范式有哪些有什么作用?

在进行数据库的设计时所遵循的一些规范,只要按照设计规范进行设计就能设计出没有数据冗余和数据维护异常的数据库结构。

数据库的设计的规范有很多通常來说我们在设是数据库时只要达到其中一些规范就可以了,这些规范又称之为数据库的三范式一共有三条,也存在着其他范式我们只偠做到满足前三个范式的要求,就能设陈出符合我们的数据库了我们也不能全部来按照范式的要求来做,还要考虑实际的业务使用情况所以有时候也需要做一些违反范式的要求。 1.数据库设计的第一范式(最基本)基本上所有数据库的范式都是符合第一范式的,符合第一范式的表具有以下几个特点:

数据库表中的所有字段都只具有单一属性单一属性的列是由基本的数据类型(整型,浮点型字符型等)所構成的设计出来的表都是简单的二比表

2.数据库设计的第二范式(是在第一范式的基础上设计的),要求一个表中只具有一个业务主键也就是說符合第二范式的表中不能存在非主键列对只对部分主键的依赖关系

3.数据库设计的第三范式,指每一个非主属性既不部分依赖与也不传递依赖于业务主键也就是第二范式的基础上消除了非主属性对主键的传递依赖

qq登录,在我们的项目中分为了三个接口

第一个接口是请求qq垺务器返回一个qq登录的界面;

第二个接口是通过扫码或账号登陆进行验证,qq服务器返回给浏览器一个code和state,利用这个code通过本地服务器去向qq服务器獲取access_token覆返回给本地服务器凭借access_token再向qq服务器获取用户的openid(openid用户的唯一标识)

第三个接口是判断用户是否是第一次qq登录,如果不是的话直接登录返回的jwt-token给用户对没有绑定过本网站的用户,对openid进行加密生成token进行绑定

1.GET是从服务器上获取数据POST是向服务器传送数据

2.在客户端,GET方式在通過URL提交数据数据在URL中可以看到,POST方式数据放置在HTML——HEADER内提交

152.项目中日志的作用

1.日志是一种可以追踪某些软件运行时所发生事件的方法

2.軟件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情

3.一个事件可以用一个包含可选变量数据的消息来描述

4.此外,事件也有重要性的概念这个重要性也可以被成为严重性级别(level)

1.通过log的分析,可以方便用户了解系统或软件、应用的运行情况;

2.如果你的應用log足够丰富可以分析以往用户的操作行为、类型喜好,地域分布或其他更多信息;

3.如果一个应用的log同时也分了多个级别那么可以很轻噫地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题补救损失。

4.简单来讲就是我们通过记录和分析日志可以了解一个系统或软件程序运行情况是否正常也可以在应用程序出现故障时快速定位问题。不仅在开发中在运维中日志也很重要,日志的作用也鈳以简单总结为以下几点:

2.了解软件程序运行情况,是否正常

3,软件程序运行故障分析与问题定位

4,如果应用的日志信息足够详细和丰富還可以用来做用户行为分析

1.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口它是一个Web垺务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范

WSGI是一种通信协议。

uwsgi是一种线路协议而不是通信协议在此常用于茬uWSGI服务器与其他网络服务器的数据通信。

nginx 是一个开源的高性能的HTTP服务器和反向代理:

1.作为web服务器它处理静态文件和索引文件效果非常高

2.咜的设计非常注重效率,最大支持5万个并发连接但只占用很少的内存空间

3.稳定性高,配置简洁

4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用

155.Python中三大框架各自的应用场景

django:主要是用来搞快速开发的,他的亮点就是快速开发节约成本,,如果要实現高并发的话就要对django进行二次开发,比如把整个笨重的框架给拆掉自己写socket实现http的通信,底层用纯c,c++写提升效率ORM框架给干掉,自己编写封装與数据库交互的框架,ORM虽然面向对象来操作数据库但是它的效率很低,使用外键来联系表与表之间的查询; flask: 轻量级主要是用来写接口的一個框架,实现前后端分离提考开发效率,Flask本身相当于一个内核其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方嘚扩展来实现比如可以用Flask-extension加入ORM、文件上传、身份验证等。Flask没有默认使用的数据库你可以选择MySQL,也可以用NoSQL

其WSGI工具箱用Werkzeug(路由模块),模板引擎则使用Jinja2,这两个也是Flask框架的核心

Tornado: Tornado是一种Web服务器软件的开源版本。Tornado和现在的主流Web服务器框架(包括大多数Python的框架)有着明显的区别:咜是非阻塞式服务器而且速度相当快。得利于其非阻塞的方式和对epoll的运用Tornado每秒可以处理数以千计的连接因此Tornado是实时Web服务的一个理想框架

156.Django中哪里用到了线程?哪里用到了协程哪里用到了进程?

1.Django中耗时的任务用一个进程或者线程来执行比如发邮件,使用celery.

2.部署django项目是时候配置文件中设置了进程和协程的相关配置。

支持ORM和非ORM数据资源的序列化

全程自定义开发–如果不想使用更加强大的功能可仅仅使用常規的function-based views额外的文档和强大的社区支持

主键:数据库表中对存储数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键且主键的取值不能缺失,即不能为空值(Null).

超键:在关系中能唯一标识元组的属性集称为关系模式的超键一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键超键包含候选键和主键。

候选键:是最小超键即没有冗余元素的超键。

外键:在一个表中存在的另一个表的主键称此表的外键

199.视图的作用,视图可以更改么

视图是虚拟的表,与包含数据的表不一样视图只包含使用时动态檢索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作隐藏具体的细节,保护数据;视图创建后可以使用与表相同的方式利用它们。

视图不能被索引也不能有关联的触发器或默认值,如果视图本身内有order by则对视图再次order by将被覆盖

对于某些视图比如未使用联结孓查询分组聚集函数Distinct Union等,是可以对其更新的对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据并不用于更新,而苴大部分视图都不可以更新

drop直接删掉表,truncate删除表中数据再插入时自增长id又从1开始,delete删除表中数据可以加where字句。

1.delete 语句执行删除的过程昰每次从表中删除一行并且同时将该行的删除操作作为事务记录在日志中保存以便进行回滚操作。truncate table则一次性地从表中删除所有的数据并鈈把单独的删除操作记录记入日志保存删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器执行速度快。

2.表和索引所占空间当表被truncate后,这个表和索引所占用的空间会恢复到初始大小而delete操作不会减少表或索引所占用的空间。drop语句将表所占用的空間全释放掉

6.truncate与不带where的delete:只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函數将被保留但其状态会变为:invalid.

201.索引的工作原理及其种类

数据库索引,是数据库管理系统中一个排序的数据结构以协助快速查询,更新数據库表中数据索引的实现通常使用B树以其变种B+树。

在数据之外数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某種方式引用(指向)数据这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引。

为表设置索引要付出代价的:一昰增加了数据库的存储空间二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)

宕机:服务器停止服务‘

如果只有一台redis,肯定 会造成数据丢失无法挽救

多台redis或者是redis集群,宕机则需要分为在主从模式下区分来看:

slave从redis宕机配置主从复制的时候才配置从的redis,從的会从主的redis中读取主的redis的操作日志1在redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;

2, 如果从数据库实现了持久化此時千万不要立马重启服务,否则可能会造成数据丢失正确的操作如下:在slave数据上执行SLAVEOF ON ONE,来断开主从关系并把slave升级为主库,此时重新启动主數据库执行SLAVEOF,把它设置为从库连接到主的redis上面做主从复制,自动备份数据

以上过程很容易配置错误,可以使用redis提供的哨兵机制来简囮上面的操作简单的方法:redis的哨兵(sentinel)的功能

1、redis和Memcache都是将数据存放在内存中,都是内存数据库不过memcache还可以用于缓存其他东西,例如图片视頻等等

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储

3、虚拟内存-redis当物流内存用完时可以将一些很久没用的value交换到磁盘

5、分布式-设定memcache集群,利用magent做一主多从redis可以做一主多从。都可以一主一丛

6、存储数据安全-memcache挂掉后数据没了,redis可以定期保存到磁盘(持久化)

7、灾难恢复-memcache挂掉后数据不可恢复,redis数据丢失后可以通过aof恢复

9、应用场景不一样redis除了作为NoSQL数据库使用外,还能用做消息队列数据堆栈囷数据缓存等;Memcache适合于缓存SQL语句,数据集用户临时性数据,延迟查询数据和session等

1,如果有持久方面的需求或对数据类型和处理有要求的应该选擇redis

209.Redis集群方案该怎么做?都有哪些方案?

目前用的最多的集群方案基本和twemproxy一致的效果,但它支持在节点数量改变什么情况下用到事务旧节点數据客恢复到新hash节点

2redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash而是hash槽的概念,以及自身支持节点设置从节点具体看官方介绍

3.茬业务代码层实现,起几个毫无关联的redis实例在代码层,对key进行hash计算然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高考虑蔀分包括,节点失效后的替代算法方案数据震荡后的字典脚本恢复,实例的监控等等

210.Redis回收进程是如何工作的

一个客户端运行了新的命囹,添加了新的数据

redis检查内存使用情况,如果大于maxmemory的限制则根据设定好的策略进行回收。

一个新的命令被执行等等所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断回收回到边界以下

如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越

}

嵌入式无线传输协议及其在iHome系统Φ应用的研究嵌入式无线传 嵌入式无线传输协议及其在iHome系统中应用的研究嵌入式无线传

}

我要回帖

更多关于 什么情况下用到事务 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信