天天看点

Web编程语言学习笔记(一)

1、服务模型认识与比较 Php本身没有对线程的支持,一次新的请求对应一个新的进程,每个请求有着独立的上下文,彼此之间互不影响。Php执行的过程是同步的、阻塞的,如果前一行代码执行返回需要很长时间,那么下一行代码也只能等到上一行返回结果才能开始执行。当然它也能实现异步的机制,比如通过消息队列,将请求放入队列后立即返回,后台的守护进程通过轮询取出消息队列中的数据再进行相应的处理,这是典型的生产者/消费者模型,需要定时进行心跳测试检测进程是否存在。 Python、Java实现的多线程架构,用线程处理请求,比进程更加轻量级,线程之间的数据可以共享,面临的主要问题就是同步、加锁,当并发量大时,CPU频繁切换上下文也会造成极大开销。多线程中比较典型的应用有数据库连接池等,很好地减轻了频繁建立和销毁数据库连接带来的性能损耗,同时Java也对非阻塞通信提供了支持。 Nodejs同样是单线程架构,它本身运行在单线程上,但底层I/O的实现用的是另外的线程池。和运行在客户端的JavaScript一样,是基于事件驱动的异步模型。JavaScript将异步的回调函数,放入红黑树中,通过轮询操作迭代遍历红黑树,从而异步地执行回调函数;Nodejs的异步I/O同样用到轮询,只不过它是将请求连同回调函数封装到请求对象,交给封装的libuv,底层应用轮询机制,将未处理的请求对象分配给空闲的线程,执行回调之后归还线程。

2、对象拷贝 深拷贝,就是创建对象的一个副本然后赋给变量,也叫克隆,传递的是值。 浅拷贝,就是传递的引用,以Java为例,变量存储在栈内存中,具体的对象实例或者数组等存储在堆内存中,变量指向对象所在的内存空间,浅拷贝就是让另一个变量指向同一片内存空间,引用同一个对象。 在Java中,方法中的参数,如果是数值型,传递的是值,在方法体里改变它的值不会对传入参数的值造成影响,如果参数的类型是引用型,那么传递的就是引用,也就是浅拷贝,可以在方法体内改变传入对象的值等一些属性。Js等其他一些语言亦是如此。 Php则不一样,在Php函数或方法中的参数如果只写了参数的名称实现的都是深拷贝,如果要传递引用,则要在参数变量前加上&符号,对数值型变量传引用也是同样的做法。

继续阅读