python进程之间的通信方式有哪些,python进程和线程之间通信
仅供学习,转载请注明出处。
进程间通信-QueueProcess不能像线程一样共享全局变量,那么如果需要在它们之间传递值,它们该怎么办?
针对这一需求,操作系统提供了许多机制来实现进程间的通信,比如队列。
队列的使用可以利用多处理模块的队列来实现多个进程之间的数据传输。队列本身是一个消息队列程序。首先,用一个小例子来演示队列的工作原理:
在[2]中:来自多处理导入队列
In [3]: q=Queue(3) #创建一个只有3个位置的队列
在[4]: q.put(《兰利群》)
In [5]: q.put(《芙蓉王》)
In [6]: q.put(万宝路)
在[7]中:
In [7]: q.put (Marlboro) #当第四个数据插入队列时,队列被阻塞。您需要等待队列被释放,然后才能再次插入。从上面可以看出,队列的大小是有限的。那么如何检查队列是否已满呢?
In [8]: print(q.full()) #检查队列是否已满
真实的
In [9]: q.get() #获取队列的第一个数据
out[9]: \ xe8 \ x93 \ x9d \ xe5 \ x88 \ xa9 \ xe7 \ xbe \ xa4
In [10]: print(q.full()) #检查队列是否已满
错误的
在[11]:使用get方法得到一个队列的内容数据后,队列不满意。
让我们来看看队列操作的小案例:
#编码=utf-8
从多重处理导入队列
Q=Queue(3) #初始化一个队列对象,它最多可以接收三个put消息。
Q.put(“消息1”)
Q.put(“消息2”)
print(q.full()) #False
Q.put(“消息3”)
print(q.full()) #True
#由于消息队列已满,下面的尝试将引发异常,第一次尝试将等待2秒后引发异常,第二次尝试将立即引发异常。
尝试:
Q.put(消息4 ,真,2)
除了:
Print(消息队列已满,现有消息数:%s%q.qsize())
尝试:
Q.put_nowait(消息4 )
除了:
Print(消息队列已满,现有消息数:%s%q.qsize())
#推荐方式,写之前判断消息队列是否已满。
如果不是q.full():
Q.put_nowait(消息4 )
#读取消息时,先判断消息队列是否为空,然后再读取。
如果不是q.empty():
对于范围内的I(q . qsize()):
Print(q.get_nowait())执行如下:
[root @ server 01 process]# python queue . py
错误的
真实的
消息队列已满,现有消息数:3
消息队列已满,现有消息数:3
1条消息
消息2
3新闻
[root@server01进程]#
解释
在初始化Queue()对象时(例如:q=Queue()),如果括号中没有指定可以接收的最大消息数,或者该数为负数,则表示可以接受的消息数没有上限(直到内存结束);
Queue.qsize():返回当前队列中包含的消息数;
Queue.empty():如果队列为空,则返回True,否则返回false
Queue.full():如果队列已满,则返回True,否则返回False;
Queue.get([block[,timeout]]):获取队列中的消息,然后将其从队列中移除。block的默认值为True;
1)如果使用缺省值block,并且没有设置超时(单位秒),如果消息队列为空,那么程序将被阻塞(停止在读取状态),直到从消息队列中读取消息。如果设置了超时,它将等待超时秒,如果没有消息被读取,它将抛出一个队列。“Empty”异常;
2)如果block值为假,如果消息队列为空,则‘Queue。将立即引发“Empty”异常;
queue . get _ nowait():quite queue . get(false);
Queue.put (item,[block [,timeout]]):将item消息写入队列,block默认值为True;
1)如果block使用默认值且未设置timeout(单位秒),则如果消息队列中没有写入空间,程序将被阻塞(停止在写入状态),直到消息队列中有可用空间。如果设置了超时,它将等待超时秒,如果没有空间,它将抛出一个队列。“完整”异常;
2)如果block值为False,消息队列将立即抛出一个 queue。如果没有空间可写,则出现“Full”异常;
queue . put _ nowait(item):quite queue . put(item,False););
示例队列:以队列为例。在父进程中创建了两个子进程,一个将数据写入队列,另一个从队列中读取数据:
#编码=utf-8
从多重处理导入流程,队列
导入操作系统,时间,随机
#编写由数据进程执行的代码:
定义写入(q):
对于[A , B , C]中的值:
打印(将%s放入队列.%值)
价值
time.sleep(random.random())
#读取数据进程执行的代码:
定义读取(q):
虽然正确:
如果不是q.empty():
value=q.get(True)
打印(从队列中获取%s %值)
time.sleep(random.random())
否则:
破裂
if __name__==__main__ :
#父进程创建一个队列,并将其传递给每个子进程:
q=队列()
pw=进程(target=write,args=(q,))
pr=进程(target=read,args=(q,))
#发起人流程pw,写:
pw.start()
#等待pw结束:
pw.join()
#推广人流程pr,阅读:
pr.start()
pr.join()
# pr的过程是一个死循环。你不能等待它的结束,只能强行终止:
打印()
打印(所有数据写入和读取)按如下方式执行:
[root @ server 01 process]# python queue . py
将放入队列.
将B放入队列.
将C放入队列.
从队列中获取。
从队列中获取B。
从队列中获取C。
所有数据都被写入和读取。
[root@server01进程]#
关注微信微信官方账号,回复【数据】,Python,PHP,JAVA,web,即可获取Python,PHP,JAVA,前端等视频数据。
来自海洋的渔夫原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。