首页 > 系统相关 >进程间通信

进程间通信

时间:2022-11-19 22:44:10浏览次数:42  
标签:信号量 Process 间通信 print 进程 import 共享内存 data

---pipe管道

概念:在内存中开辟管道空间,生产一个管道对象,多个进程使用同一个管道

'''管道通信
multiprocessing中管道通信只能用于有亲缘关系进程中,即父子进程,兄弟进程
2.管道对象在父进程中创建,子进程通过父进程获取
'''
from multiprocessing import Pipe,Process
#创建管道
fd1,fd2 = Pipe(duplex=True)     #默认为True双向管道,双方都写读,如果是单向,只能一边读,一边写
def app1():
    print('启动app1,请登录')
    print('请求app2 授权')
    fd1.send('app1 请求登录')       #写入管道
    data = fd1.recv()               #从管道接受数据
    print('登录成功',data)
def app2():
    print('启动app2')
    data = fd2.recv()       #recv阻塞函数,如果管道内没有内容,会阻塞
    print(data)
    fd2.send('账号:alex,密码:123')
things = [(app1,fd1),(app2,fd2)]
jobs = []
for th in things:
    print(th[0],th[1])
    p = Process(target=th[0])
    jobs.append(p)
    p.start()
for job in jobs:
    job.join()

 

---基于消息队列

基本用法

q = Queue(maxsize=0)
功能: 创建队列对象
参数:最多存放消息个数
返回值:队列对象

q.put(data,[block,timeout])
功能:向队列存入消息
参数:data 要存入的内容
block 设置是否阻塞 False为非阻塞
timeout 超时检测

q.get([block,timeout])
功能:从队列取出消息
参数:block 设置是否阻塞 False为非阻塞
timeout 超时检测
返回值: 返回获取到的内容

q.full() 判断队列是否为满
q.empty() 判断队列是否为空
q.qsize() 获取队列中消息个数
q.close() 关闭队列

'''
消息队列,先进先出原则
'''
from multiprocessing import Process,Queue
from random import randint
from time import sleep

q = Queue(maxsize=10)

def handle():
for i in range(6):
x = randint(1,33)
q.put(x) #消息入队
q.put(randint(1,16))

def request():
while True:
print('摇号中')
sleep(1)
print(q.get(3)) #出队列
if q.empty():
break
p1 = Process(target=handle)
p2 = Process(target=request)
p1.start()
p2.start()
p1.join()
p2.join()

  

---共享内存

在内存中开辟一块空间,进程可以进行写读,但是每次写入内容会覆盖之前的内容

缺点:一次只能存一组数或一个数

value:只能存放一个数

  obj = Value(ctype,data)
  功能 : 开辟共享内存
  参数 : ctype 表示共享内存空间类型 'i' 'f' 'c'
  data 共享内存空间初始数据
  返回值:共享内存对象
  obj.value 对该属性的修改查看即对共享内存读写

array:一次存放一组数

  

obj = Array(ctype,data)
  功能: 开辟共享内存空间
  参数: ctype 表示共享内存数据类型
  data 整数则表示开辟空间的大小,其他数据类型表示开辟空间存放的初始化数据
  返回值:共享内存对象
  Array共享内存读写: 通过遍历obj可以得到每个值,直接可以通过索引序号修改任意值。
  * 可以使用obj.value直接打印共享内存中的字节串

'''
value,开辟一个单一的共享内存空间
共享内存中只能存入一个值
'''
from multiprocessing import Value,Process
import time
import random
#创建共享内存
money = Value('i',5000)
#操作共享内存
def man():
    for i in range(30):
        time.sleep(0.2)
        money.value += random.randint(1,1000)

def girl():
    for i in range(30):
        time.sleep(0.2)
        money.value -= random.randint(1,500)

p1 = Process(target=man)
p2 = Process(target=girl)
p1.start()
p2.start()
p1.join()
p2.join()
print('余额:',money.value)

 

--信号量

  sem = Semaphore(num)
  功能 : 创建信号量对象
  参数 : 信号量的初始值
  返回值 : 信号量对象

  sem.acquire() 将信号量减1 当信号量为0时阻塞
  sem.release() 将信号量加1
  sem.get_value() 获取信号量数量

'''
sem 信号量演示
思路:信号量数量相当于资源,执行任务必须消耗资源
'''

from multiprocessing import Semaphore,Process
from time import sleep
import os

#创建信号量(做多允许三个任务同时执行)
sem = Semaphore(3)
#任务函数
def fun1():
    sem.acquire()       #执行一个任务必须消耗一个信号量
    print(' 执行任务1--',os.getpid())
    sleep(5)
    print('完成任务1--',os.getpid())
    sem.release()           #任务执行完成,再增加一个信号量

#10个任务需要执行
jobs=[]
for i in range(9):
    p = Process(target=fun1)
    jobs.append(p)
    p.start()
for i in jobs:
    i.join()

 

标签:信号量,Process,间通信,print,进程,import,共享内存,data
From: https://www.cnblogs.com/powfu/p/16907411.html

相关文章

  • 多进程- 进程join方法 - IPC机制 - 多种方法
    目录同步与异步阻塞与非阻塞综合使用创建进程的多种方式进程间数据隔离进程join方法IPC机制生产者消费者模型进程对象的多种方法僵尸进程与孤儿进程守护进程同步与异步用......
  • ZABBIX开发自定义进程关键字监控
    脚本内容:#!/bin/sh####################################################Usedtomonitorthenumberofprocesskeywords#scriptbyshell#writedbyDeliver#20......
  • 同步与异步 multiprocessing 进程对象多种方法
    目录同步与异步阻塞与非阻塞综合使用创建进程的多种方式前言windows系统创建进程的问题(重要)multiprocessing模块之Process展现异步创建进程的方式(一):使用Process()创建进程......
  • 进程
    进程任务的提交方式与执行状态同步与异步同步与异步是用来表达任务的提交方式同步就是提交完任务之后原地等待任务的返回结果,期间不做任何事异步就是提交完任务之......
  • 同步异步、阻塞非阻塞、进程
    1.同步与异步1.同步异步用来表达任务的提交方式2.同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到......
  • 子进程相关基础知识
    昨日内容回顾粘包问题及解决思路粘包问题:TCP协议下将人认知中应该分来的数据打包发送,导致所谓粘包问题。解决思路:明确应接收数据的长度(至少首次收到的数据长度应明......
  • 同步与异步、阻塞与非阻塞、综合使用、创建进程的多种方式、进程间数据隔离、进程的jo
    同步与异步用来表达任务的提交方式同步 提交完任务之后原地等待任务的返回结果期间不做任何事异步 提交完任务之后不愿地等待任务的返回结果直接去做其他事有结果......
  • 同步与异步,阻塞与非阻塞,进程,互斥锁
    目录同步与异步,阻塞与非阻塞,进程,互斥锁今日内容概要今日内容详细同步与异步阻塞与非阻塞综合使用创建进程的多种方式进程间数据隔离进程的join方法IPC机制生产者消费者模型......
  • Ubuntu上如何用指令运行nginx,还有查看相应的进程
    1、运行nginxnginx是web服务器,要执行起来才能够看到相应的进程信息sudo ./nginx(注意是在什么目录下使用这个命令)./ 表示当前目录下,如果不加上./就找不到nginx../......
  • 进程,多线程
    今日内容详细同步与异步用来表达任务的提交方式同步 提交完任务之后原地等待任务的返回结果期间不做任何事异步 提交完任务之后不原地等待任务的返回结果直接去做......