这几天,由于工作原因,需要将一个php写的后台程序重串行执行改成并行执行。这样必然涉及到多线程/多进程相关技术。PHP貌似没有成熟的多线程机制,而有相对成熟的多进程机制。多进程编程,必然涉及到IPC(Inter-Process Communication)。PHP的IPC技术还是相当多的,可以在php源代码目录下(PHP_SRC/ext)看到sysvshm,sysvsem,sysvmsg,shmop等扩展,这些都可以用于IPC,下面简单介绍一下:
pcntl - 提供进程相关操作函数
sysvsem - 信号量,全称为system V semphore,可以用于限制访问共享资源的进程数目,一般设置为1,当作互斥锁使用
sysvshm - 共享内存,全称system V shared memory,用于提供共享内存机制,特点是省去了客户代码序列化和反序列化的麻烦,变量级别的访问控制,十分好用,属于菜鸟使用的方式。
shmop - 共享内存操作扩展,与sysvshm的区别在于是比特级别的控制,需要手动序列化和反序列化,但是如果紧缺使用,内存使用率比sysvshm高,属于高手进阶方式。
下面是使用sysvsem的列子,作为备忘,具体的内容参见代码,这里只提出几个关键需要注意的地方:
shm_attach和sem_get的方法的key需要与主进程ID关联,避免两个组件同时运行打搅,因为共享内存和信号量是系统级别的资源,进程之间会公用,如果不处理,会导致多个实例之间出现混乱。
父进程在等待子进程时,忙等会消耗大量CPU,采用sleep的方式,可以避免忙等。
父进程等待子进程最好有超时机制,避免无限制等待
子进程逻辑必须在规定的地方退出,不能执行父进程的代码,否则会混乱。常见的方式是用try catch包裹子进程的逻辑,抓到异常后,退出。
<a></a>
相关资料
<b>声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。</b>
<b></b>
<b>本文转自bourneli博客园博客,原文链接:</b><b>http://www.cnblogs.com/bourneli/archive/2012/08/03/2622131.html</b><b>,如需转载请自行联系原作者</b>