首页 > 自动化运维 > python > 进程间通讯 (二)—Queue的使用
2015
11-19

进程间通讯 (二)—Queue的使用

  1. Queue 是一个消息队列,队列长度可以无限或者有限

  2. 用于父子进程通讯,两个没有关系的进程不能使用queue通信

  3. 当多个进程同时对队列写的时候需要进行同步(lock.acquire),保证一个时刻内只有一个进程对队列进行写操作

一、创建子进程

1.1、使用os.fork() 函数创建子进程

#conding=utf8
import os
from multiprocessing import Queue,Process
import time
Qmsg = Queue()

pid = os.fork()
if(pid == 0):
# 使用Qmsg.get获取队列信息
        msg = Qmsg.get()
        print msg
else:
# 使用Qmsg.put将信息放入到队列中
        Qmsg.put('hello tshare365.com')
        os.wait()

执行结果

上面我们使用os.fork()函数的写法,那么python还有其它写法吗?答案是有的。我们可以使用Process类

1.2、使用Process创建进程

先看一下它的帮助信息

[root@localhost ~]# python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from multiprocessing import Process
>>> help(Process)

重点看这三个


 |  join(self, timeout=None)
 |      Wait until child process terminates
 |  
 |  run(self)
 |      Method to be run in sub-process; can be overridden in sub-class
 |  
 |  start(self)
 |      Start child process

join:进程回收

run:启动一个父进程

start:启动一个子进程

下面我们演示一下Process类的使用,并从获取pid的值中对比一下run和start的区别

start代码:

#coding=utf8
import os
from multiprocessing import Queue,Process
import time
Qmsg = Queue()
#定义一个Children_run函数
def Children_func(name):
#打印出他的pid
        print 'Children Pid=%d' % os.getpid()
        msg = Qmsg.get()
        print "name=%s, msg=%s" %(name,msg)
#打印父进程的pid
print 'Father Pid=%d' % os.getpid()
#使用Process类创建父子进程 target=后面是上面的函数名称,args=后面是执行函数中需要传人的参数

p = Process(target=Children_func, args=('Children1',))
Qmsg.put('hello tshare365.com')
p.start()
p.join()

run代码:(只是将p.start换成p.run)

因为没有子进程了所以不需要join函数

import os
from multiprocessing import Queue,Process
import time
Qmsg = Queue()

def Children_func(name):
        print 'Children Pid=%d' % os.getpid()
        msg = Qmsg.get()
        print "name=%s, msg=%s" %(name,msg)

print 'Father Pid=%d' % os.getpid()
p = Process(target=Children_func, args=('Children1',))
Qmsg.put('hello tshare365.com')
p.run()

执行结果

1.png

由上面的执行结果的pid可以看出来,使用start的时候我们创建了子进程,而使用run函数时没有创建子进程。所以我们一般都用start函数

下一篇我们介绍进程锁的使用




最后编辑:
作者:tshare365
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复