python 进程通信

最近看了本有关linux的书,提到了posix ipc 这种进程通信技术,想来,python一定有合适的库来做这件事情,百度一番,果不其然,有一个名叫poxis_ipc的库,随手写了几个小的示例,分享给大家,参考资料地址 http://semanchuk.com/philip/posix_ipc/


        1、Shared memory

      共享内存需要用到内存文件映射,关于这项技术,之前的博客有过介绍,不再赘述,看代码:

         

#coding=utf-8
import os 
import mmap
import time
import posix_ipc
size = os.statvfs('.')[1]
mem = posix_ipc.SharedMemory('/foo', posix_ipc.O_CREAT,size=size)
f = mmap.mmap(mem.fd, size)
i = 0
while i<20:
    seconds = int(time.time())
    
    f[:10] = (str(seconds))
    time.sleep(2)
    i += 1
f.close()
mem.close_fd()
mem.unlink()

      代码很容易读懂,需要解释的一点是,内存文件映射要求映射的大小是内存页大小的整数倍,如果你分配的不是整数倍,那么最后一块所在的内存页仍然是会被完成的映射进来。

      这段程序每隔两秒钟向映射的内存中写入当前的秒数,一共写20次,然后退出。为了演示效果,我们还需要另一个程序来读取数值

     

#coding=utf-8
import os 
import mmap
import time
import posix_ipc

size = os.statvfs('.')[1]

mem = posix_ipc.SharedMemory('/foo', posix_ipc.O_CREAT,size=size)
f = mmap.mmap(mem.fd,size,access=mmap.ACCESS_WRITE)
while True:
    print f[:10]
    time.sleep(3)
       同时运行这两个脚本,先后顺序不用关心,一个写,一个读,便完成了进程间信息的交换


       2、Message Queues

        使用message queues,一个进程可以直接向另一个进程发送消息
        先上接收端的代码
       
#coding=utf-8
import posix_ipc
import time
mq = posix_ipc.MessageQueue('/kwsy', posix_ipc.O_CREAT)
print mq.name
#mq.send('foo')
#time.sleep(3)
while True:
    print mq.receive()
        我这里使用的是阻塞的方法

        再看发送端代码
   
#coding=utf-8
import posix_ipc
import time
mq = posix_ipc.MessageQueue('/kwsy', posix_ipc.O_CREAT)
mq.send('foo',priority=9)

         一次运行只发送一个消息,消息的优先级是9
        如果有一个进程接收消息,有两个进程发送消息,会是什么情况呢,什么都不用担心,这个时候两个进程发送的消息都会发送到接收进程中。如果是一个进程发送,两个进程同时接收,那么两个进程几乎是平分这些消息。

            3、 Semaphore

       关于信号量,如果你会多线程,那么你多少对信号量有所了解。这里有两个重要方法,一个是acquire,一个是release,前者在信号量大于0时触发,并将信号量减1,而后者负责对信号量加1

       
#coding=utf-8
import posix_ipc
import time

sem = posix_ipc.Semaphore('/sp', posix_ipc.O_CREAT,initial_value=0)

sem.acquire()

print 'ok'
#sem.close()
sem.unlink()

        信号量初始为0,程序会一直阻塞在sem.acquire这一行,直到有一个进程执行release改变信号量使得信号量的值大于0为止
    
#coding=utf-8
import posix_ipc
sem = posix_ipc.Semaphore('/sp', posix_ipc.O_CREAT)
sem.release()

       工作中几乎没有用到过进程通信,对这种技术的理解也不深入,写几个简单的实例,将来如果用到了,可以快速入手。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值