进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等

1.共享内存

Python可以通过mmap模块实现进程之间的共享内存

mmap文件对象既像一个字符串也像一个普通文件对象。像字符串时因为我们可以改变其中的单个字符,如,obj[index] = 'a',同时我们也可以改变一小段的字符,如 obj[2:5]='aaa'。像文件对象是因为在mmap中会有操作标记,我们可以使用seek()方法来改变mmap对象的操作标记
mmap对象通过mmap()方法来构建,Windows系统和Unix系统下,构建方法是不同的。
window的构造方法:
class mmap.mmap(filenolength[, tagname[, access[, offset]]])
linux的构造方法:
class mmap.mmap(filenolength[, flags[, prot[, access[, offset]]]])
 
fileno是文件的标号,可以是普通的文件对象的标号,(文件对象通过fileno()方法获得),也可以是-1,-1代表这个内存是无名的。length参数定义该内存的长度,如果为0,就去fileno对应的文件的最大长度,access是改mmap对象的权限,可以是ACCESS_READ,ACCESS_WRITE ,ACCESS_COPY三个值,
linux中,
flags的值可以是MAP_PRIVATE 和MAP_SHARED ,默认是MAP_SHARED ,改参数用来标识改内存是私有的还是共享的
prot的值可以是PROT_READ 和PROT_WRITE,也是用来定义该mmap的权限的
flags+ prot 和access这种权限定义方式只能取一种,否则会报错
window中
tagname是这个mmap的标记,用来唯一标记这一块共享内存,作用像fileno
 
由于有tagname这个参数,所以在windows中,可以通过领fileno为-1,然后自定义一个tagname,例如‘mysharename’,来令多个进程都能共享同一块内存
但是在linux中,这种方法就不可以用了,只能通过打开一个文件,获取fileno来实现。
所以在window中,共享内存更加灵活
mmap对象常用的方法:
mmap.close() 关闭对象
mmap.find(string[, start[, end]])   在共享内存中查找内容,返回匹配内容最小的操作标记
mmap.flush([offset, size])  把内存的数据保存到硬盘中
mmap.move(dest, src, count) 移动操作标记
mmap.read(num)  从操作标记开始读取num个长度的字符
mmap.read_byte()  读取二进制数据
mmap.readline()   读取一行数据
mmap.resize(newsize)  修改mmap的长度
mmap.rfind(string[, start[, end]])   在共享内存中查找内容,返回匹配内容最大的操作标记
mmap.seek(pos[, whence])  移动操作标记
mmap.size()  返回mmap对象的长度
mmap.tell()  返回当前操作标记的位置
mmap.write(string)  写入内容.
mmap.write_byte(byte)  写入二进制内容
linux构造例子:
 
share_file='/tmp/mm.txt'
f = open(share_file, 'wb')
f.write('a' * share_size)
f.close()
f = open(share_file, 'r+b')
mm = mmap.mmap(f.fileno(), 0)
f.close()

因为mmap对象的长度不能大于文件的长度,不然会报错:ValueError: mmap offset is greater than file siz

所以需要以wb的形式,先打开共享的文件,然后写入需要共享内存的长度的内容,关闭文件后以r+b方式打开文件,然后构造mmap对象。

当然,下次就可以直接用r+b的方式打开文件,然后构造对象了

参考:https://docs.python.org/2/library/mmap.html#module-mmap

2.信号

信号(signal)--     进程之间通讯的方式。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

几个常用信号:

SIGINT     终止进程  中断进程  (control+c)

SIGTERM   终止进程     软件终止信号

SIGKILL   终止进程     杀死进程

SIGALRM 闹钟信号

相对于共享内存,信号更加偏向于系统层面的,linux系统也是通过信号来管理进程,而且系统也规定了某些进程接到某些信号后的行为。

当然我们可以通过绑定信号处理函数来修改进程收到信号以后的行为

#encoding=utf-8
import os
import signal
from time import sleep
def my_term(a,b):
print "收到sigterm信号"
signal.signal(signal.SIGTERM,my_term)
def my_usr1(a,b):
print "收到SIGUSR1信号"
signal.signal(signal.SIGUSR1,my_usr1)
while 1:
print "我是进程id是",os.getpid()
sleep(1)

可以通过os.kill(pid,信号)来主动发送信号

3.通过Queue

__author__ = 'lujianxing'
import threading
from time import sleep def f(q,t):
q.put(t) from multiprocessing import Process,Queue
if __name__ == '__main__':
q=Queue()
p = Process(target=f, args=(q,'ljx.sa'))
p.start()
p.join()
p1 = Process(target=f, args=(q,'ljx.elex'))
p1.start()
p1.join()
print q.qsize()

Python的进程间通信的更多相关文章

  1. Python、进程间通信、进程池、协程

    进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...

  2. Python 实现进程间通信(网络编程)

    [网络编程] 1):网络编程是什么意思,网络编程指的是不同机器之间通过网编相互发信息,我们常用的“QQ”,“微信”,“邮箱” 都个网编编程的应用: 网编编程在技术上还有另一个叫法叫“进程间通信”,进程 ...

  3. python 不同进程间通信

    from multiprocessing import Process,Queue import os def f (qq): qq.put([42,None,'hello']) #将列表传入队列qq ...

  4. python多进程——进程间通信

    (一)进程锁 抢票的例子: # -*- coding:utf-8 -*- from multiprocessing import Process, Lock import time import js ...

  5. python多进程间通信

    这里使用pipe代码如下: import time from multiprocessing import Process import multiprocessing class D: @stati ...

  6. python进程间通信 实例

    python实现进程间通信简单实例 实例讲解了python实现两个程序之间通信的方法,具体方法:该实例采用socket实现,与socket网络编程不一样的是socket.socket(socket.A ...

  7. python学习笔记(十)——进程间通信

    python 在进程间通信时有很多方式,比如使用Queue的消息队列,使用 pip的管道通信,share memory 共享内存或 semaphore 信号量等通信方式. 这里我们演示一下通过消息队列 ...

  8. Python学习--17 进程和线程

    线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 进程 fork调用 通过fork()系统调用,就可以生成一个子进程 ...

  9. 你见过的最全面的python重点

    首先和大家说个对不起,由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西,对于Nginx的东西我没总结在这里,大家可以Python聚焦看,点击直达专栏哦. ...

随机推荐

  1. [Effective C++ --027]尽量少做转型动作

    引言                                                                                                   ...

  2. Debian 6配置GNOME桌面环境

      1.安装xorgroot@debian:~# apt-get install xorg 2.安装gdm(GNOME Display Manager)root@debian:~# apt-get i ...

  3. SWT中的布局之-----FormLayout(表格式布局)

    表格式(FormLayout类) 表格式布局管理器,通过创建组件各个边的距离来布局组件,和GridLayout一样强大. 用GridLayout与FormLayout都可以实现相同的界面效果,但有时使 ...

  4. [记录]Ubuntu下,使用Shell,简单替换有规律的文件名称

    因工作中需要将Flash转为Html5,并且要有动画效果,我将Flash的组件导出Png序列,然后将Png序列拼接成一张雪碧图(Sprite),名字为在生成雪碧图可以排序,需要改成数字名称. 而名字是 ...

  5. [YII]将ar查询结果转化成数组

    $Column= Column::model()->findAll(); $data = array_map(create_function('$m', 'return $m->getAt ...

  6. 【C语言】02-基本数据类型

    跟其他语言一样,C语言中用变量来存储计算过程使用的值,任何变量都必须先定义类型再使用.为什么一定要先定义呢?因为变量的类型决定了变量占用的存储空间,所以定义变量类型,就是为了给该变量分配适当的存储空间 ...

  7. java scoket (UDP通信模型)简易聊天室

    import java.net.DatagramPacket; import java.net.DatagramSocket; /** * 接收线程 * * @author xiaoduc * */ ...

  8. VMWare中安装CentOS6.6不能上网的解决办法

    1.首先在虚拟机中将网络配置设置成NAT 2.在windows系统,我的电脑-管理-服务 中开启VMware NAT service和VMware DHCP service. 3.在CentOS里面打 ...

  9. VMware下LINUX的虚拟机增加磁盘空间

    先关闭虚拟机电源,做如下设置:“ 虚拟机”--“虚拟机设置”--“磁盘”--“扩展” 可以随意添加你需要增到到的磁盘大小(如15Gb,表示磁盘总量,包含原来的磁盘容量); 再重启电源进入系统做如下步骤 ...

  10. SQL Server 2012 中 Update FROM子句

    首先说明一下需求以及环境 创建Table1以及Table2两张表,并插入一下数据 USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Table1', 'U') ...