PHP中的(伪)多线程与多进程?
利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序。
PHP中也能多线程了,那么问题也来了,那就是同步的问题。回龙观电脑培训知道PHP本身是不支持多线程的,所以更不会有什么像Java中synchronize的方法了。那我们该如何做呢?
1尽量不访问同一个资源。以避免冲突。但是可以同时像数据库操作。因为数据库是支持并发操作的。所以在多线程的PHP中不要向同一个文件中写入数据。如果必须要写的话,用别的方法进行同步。如调用flock对文件进行加锁等。或建立临时文件,并在另外的线程中等待这个文件的消失while(file_exits('xxx'));这样就等于这个临时文件存在时,表示其实线程正在操作。如果没有了这个文件,说明其它线程已经释放了这个。
2尽量不要从runThread在执行fputs后取这个socket中读取数据。因为要实现多线程,需要的用非阻塞模式。即在像fgets这样的函数时立即返回。。所以读写数据就会出问题。如果使用阻塞模式的话,程序就不算是多线程了。他要等上面的返回才执行下面的程序。所以如果需要交换数据最后利用外面文件或数据中完成。实在想要的话就用socket_set_nonblock($fp)来实现。
说了这么多,倒底这个有没有实际的意义呢?在什么时候需要这种用这种方法呢?
答案是肯定的。大家知道。在一个不断读取网络资源的应用中,网络的速度是瓶颈。如果采多这种形式就可以同时以多个线程对不同的页面进行读取。
1)开启的线程设置为后台线程
Thread t = new Thread(你的线程函数);
tIsBackground = true
2)建议你利用socket提供的异步回调 socketBeginXXXXX() socketEndXXXX 来实现多线程处理
-----------
利用异步回调最大的好处是:(1)可以充分利用net framework 的线程池中I/O线程,最大限度降低CPU处理开销。曾经做过处理1000多个socket TCP客户端连接的程序,双核CPU平均占用不超过12%(2)网络通信过程各种异常是不可避免的,异步编程结构很容易实现异常处理。
尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
1、用jprofiler等工具找出性能瓶颈,减少额外的开销。优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。优化数据库结构,多做索引,提高查询效率。
2、统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
3、能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
4、解决以上问题后,使用服务器集群来解决单台的瓶颈问题。基本上以上述问题解决后,达到系统最优。
定时器:使用SystemTimersTimer类 SystemTimersTimer t = new SystemTimersTimer(10000);//实例化Timer类,设置间隔时间为10000毫秒; tElapsed += new SystemTimersElapsedEventHandler(theout);//到达时间的时候执行事件; tAutoReset = true;//设置是一直执行(true)还是执行一次(false); tEnabled = true;//是否执行SystemTimersTimerElapsed事件; public void theout(object source, SystemTimersElapsedEventArgs e) { MessageBoxShow("OK!"); } 多线程方面:
多线程。
1、面向多核的服务器编程时,多线程强于epoll,因为对于每个多进程来说,资源是独立的,切换core的时候无需考虑上下文。
2、每个资源共享时以及在core切换的时候,多线程更好,多线程能够直接进行共享,而epoll资源必须从一个core复制到另一个core才能继续运算。
多线程:多线程程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行。
单线程:单线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
扩展资料:
由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能: 多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。 当前没有进行处理的任务可以将处理器时间让给其他任务。
占用大量处理时间的任务可以定期将处理器时间让给其他任务。 可以随时停止任务。 可以分别设置各个任务的优先级以优化性能。
任何一项技术的出现都是为了解决现有问题。
之前的互联网大多是单机服务,体量小。而现在的更多是集群服务,同一时刻有多个用户同时访问服务器,那么就会有很多线程并发访问。
比如,常见的电商系统场景,同一时刻比如整点抢购时,会有海量用户同时访问服务器。
如果不使用多线程处理,那基本凉凉……
所以现在公司里开发基本都是多线程的。使用多线程确实提高了运行的效率。
但与此同时,也会伴随着一些问题出现,让人很头痛。
比如,需要特别注意数据的增删改情况,也就是线程安全问题。
想要保证线程安全也有很多方式,比如说:加锁。
但是,又可能会出现其他问题,比如:死锁,所以多线程相关问题会比较麻烦。
面试官现在也非常喜欢拿多线程来考你,比如:
产生死锁的条件是什么,怎么解决死锁?
乐观锁和悲观锁如何实现,有哪些实现方式?
非公平锁和公平锁在ReentrantLock中的实现?
Lock 和 synchronized 有什么区别?
ReentrantLock和synchronized如何选择?
如今多线程在面试中已经是常客了,同时也是我们必备的知识点。
因此,我们需要理解多线程的原理和它可能会产生的问题以及如何解决问题,才能拿下高薪职位。
0条评论