进程间通信

python进程间通信

半腔热情 提交于 2020-02-24 10:04:13
Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理: import multiprocessing q = multiprocessing.Queue(3) # 初始化的Queue对象,最多能put三条消息 q.put("消息1") q.put("消息2") print(q.full()) q.put("消息3") print(q.full()) # 因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常 try: q.put("消息4", True, 2) except: print("消息已满,现有的消息为%d" % (q.qsize())) try: q.put_nowait("消息4") except: print("消息已满,现有的消息为%d" % (q.qsize())) # 推荐的方式,先判断消息列队是否已满,再写入 if not q.full(): q.put_nowait("消息4") # 读取消息时,先判断消息列队是否为空,再读取 if not q.empty(): for i in range(q

LINUX进程间通讯

自闭症网瘾萝莉.ら 提交于 2020-02-23 02:28:18
linux进程间通信概述 pid_t fork( void); 头文件:#include<unistd.h>#include<sys/types.h> (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1 pid_t 是一个类似int的宏定义 waitpid会暂时停止目前进程的执行,直到有信号来到或子进程结束。#include<sys/types.h>#include<sys/wait.h> pid_t waitpid(pid_t pid,int * status,int options); 如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。 子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码, 参数options 为0为阻塞方式 WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。 WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status

线程概念

橙三吉。 提交于 2020-02-22 19:39:01
一、多线程 多线程的处理思路 :一个运行中的程序中,具有多个执行流,各自完成一个功能模块的实现 linux的操作系统中 :认为一个pcd就是一个执行流(pcd是操作系统调用一段程序运行的 实体–描述了程序的运行过程) linux下的线程就是一个pcd pcd:是一个进程 现在,多个pcd可以共用同一个虚拟地址空间,这些pcd共用了一个运行中程序的资源 linux下的线程就是一个pcd是一个轻量级进程,因为一个运行中程序的多个pcd共用同一 份资源 一个运行中的程序就是一个进程,以前我们所说的进程,这时候再来解释,就是具有一个线程的进程,linux下的线程是一个pcb(轻量级进程),是一个进程中的一条执行流; 进程就是一个线程组 ; 二、进程/线程 1、进程跟线程是要一起说的(否则单一说会有一种冲突感) 2、进程就是一个运行中的程序,操作系统会创建一个pcb(运行中程序的描述),并且分配资 源,通过pcb来调度运行整个程序 3、线程是一个进程中的执行流,但是linux下实现进程中的执行流的时候,使用了pcb实现 4、因此就说linux下的线程是一个pcb,称作轻量级进程,因为同一个进程中的线程共用进程 分配的资源 5、而进程就是所有线程的统称,就是一个线程组,系统在运行程序,分配资源的时候是分 配给线程组,分配给整个进程 进程是资源分配的基本单位,线程是cpu调度的基本单位 三、

linux 内核与用户空间通信之netlink使用方法

﹥>﹥吖頭↗ 提交于 2020-02-22 18:37:06
摘自 https://www.cnblogs.com/x_wukong/p/5920437.html 转自:http://blog.csdn.net/haomcu/article/details/7371835 Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。通过这些IPC机制,用户空间进程之间可以完成互相通信。为了完成 内核空间 与 用户空间 通信,Linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。 本文第2节概述相关研究工作,第3节与其他IPC机制对比,详细介绍Netlink机制及其关键技术,第4节使用KGDB+GDB组合调试,通过一个示例程序演示Netlink通信过程。第5节做总结并指出Netlink通信机制的不足之处。

python进程概要

时间秒杀一切 提交于 2020-02-22 16:05:40
进程 狭义:正在运行的程序实例。 广义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,他是操作系统动态执行的基本单元。 python的进程都是并行的。 并行:两个进程同时执行一起走。 并发:逻辑上是两个线程同时进行,物理上是交替执行。 1 import multiprocessing 2 3 def fun1(i): 4 print(multiprocessing.current_process(),i) 5 6 if __name__ == "__main__": 7 mp_lst = [] 8 for i in range(100): 9 m = multiprocessing.Process(target=fun1,args=(i,)) 10 m.start() 11 mp_lst.append(m) 12 13 _ = [i.join() for i in mp_lst] 简单开启100个进程 python进程和线程的使用方式没啥区别 start() 开启进程 join() 等待,直到进程完成其工作并退出位置 为什么要使用__name__ == "__mian__"呢? 因为进程再创建时要导入目标函数的脚本,使用 __name__ == "__mian__" 方式来防止无限递归。 如果目标函数不在和开启进程同一个脚本中就不需要使用。 class

【python进阶】深入理解系统进程1

孤者浪人 提交于 2020-02-22 15:11:29
前言 在上一篇 【python进阶】深入理解系统进程1 中,我们讲述了多任务的一些概念,多进程的创建,fork等一些问题,这一节我们继续接着讲述系统进程的一些方法及注意点 multiprocessing 如果你打算编写多进程的服务程序,Unix/Linux⽆疑是正确的选择。由于 Windows没有fork调⽤,难道在Windows上⽆法⽤Python编写多进程的程 序? 由于Python是跨平台的,⾃然也应该提供⼀个跨平台的多进程⽀持。 multiprocessing模块就是跨平台版本的多进程模块。 multiprocessing模块提供了⼀个Process类来代表⼀个进程对象,下⾯的例⼦ 演示了启动⼀个⼦进程并等待其结束: from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid())) if __name__=='__main__': print('父进程 %d.' % os.getpid()) p = Process(target=run_proc, args=('test',)) print('子进程将要执行') p.start() p.join() print(

python系统编程(四)

喜你入骨 提交于 2020-02-22 15:10:52
进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。 初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行,请看下面的实例: from multiprocessing import Pool import os,time,random def worker(msg): t_start = time.time() print("%s开始执行,进程号为%d"%(msg,os.getpid())) #random.random()随机生成0~1之间的浮点数 time.sleep(random.random()*2) t_stop = time.time() print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start)) po=Pool(3) #定义一个进程池,最大进程数3 for i in range(0,10): #Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))

Python 之进程

倾然丶 夕夏残阳落幕 提交于 2020-02-22 15:08:59
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个 fork() 系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是 fork() 调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回 0 ,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用 getppid() 就可以拿到父进程的ID。 Python的 os 模块封装了常见的系统调用,其中就包括 fork ,可以在Python程序中轻松创建子进程: import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork() if pid == 0: print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())) else: print('I (%s) just created a child process (%s).' % (os

进程间通信方式

拈花ヽ惹草 提交于 2020-02-22 15:07:17
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 命名管道 (named pipe) : 命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。 套接字( socket ) : 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 来源: https:/

进程间的通信方式

本秂侑毒 提交于 2020-02-22 15:03:47
几种进程间的通信方式 (1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。 (2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。 (3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 (4)消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 (5)信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。 (6)共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。 (7)套接字(socket):套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。 来源: