Python 笔记之进程通信

复制代码
'''
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程
但是如果是上百个或者上千个目标,手动去创建进程的工作量很大,此时就可以利用到Multiprocessing模块提供的Pool方法
初始化pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满
那么就会创建一个新的进程来执行该请求;但是如果池中的进程数量已经达到指定的最大值,那么该请求会等待
直到池中有进程结束,才会创建新的进程来执行
阻塞式:添加一个执行一个,如果一个任务不结束宁外一个任务就进不来
非阻塞式:全部添加到队列中,立刻返回,并没有等待其它进程执行完毕,但是回调函数是等地啊任务完成之后才调用。
好处:设置进程数量,达到进程的复用
'''
'''
pool=Pool(max) 创建进程池对象
pool.apply()阻塞的
pool.apply_async()非阻塞的
pool.close()停止添加进程
pool.join()#让主进程让步
queue 进程通信
'''
复制代码
import os
from multiprocessing import Pool
#非阻塞式进程
import time
from random import random
from multiprocessing import Queue

q=Queue(6)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
# q.put('E')

print(q.qsize())
if not q.full():
    q.put('F',timeout=3)#put() 如果queue满了则只能等待,除非有空地则添加成功
else:
    print('队列已满')
print('++++++++++')
print(q.get())
print(q.get())
print('++++++++++')
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get(timeout=2))

print(q.put_nowait("E"))
print('++++++++++')
print(q.get_nowait())
print('---')

#进程通信
from multiprocessing import Process,Queue
import time

def download(q):
    images=['girl.jpg','boy.jpg','man.jpg']
    for image in images:
        print("正在下载:%s"%image)
        time.sleep(1)
        q.put(image)


def getfile(q):
    while True:
        try:
            file=q.get(timeout=5)
            print(f'{file}保存成功')
        except:
            print("全部保存成功")
            break

if __name__=='__main__':
    q = Queue(5)
    p1=Process(target=download,args=(q,))
    p2=Process(target=getfile,args=(q,))
    p1.start()

    p2.start()

    p2.join()
    p1.join()
复制代码
#进程,线程
#Process类
#def func(n):
#    pass
#创建进程:p=Process(target=func,name='',args=(1,),kwargs='')
#启动p.start()
#run()
from multiprocessing import Process
class MyProcess(Process):
    def run(self):
        pass

p=MyProcess()
p.start()
#进程的数据共享
n=0
#进程池:Pool
from multiprocessing import pool
p=pool(5)
#阻塞式 apply(func,args,kwargs)
#非阻塞式 apply_async(fun,args,kwargs,callback=函数)
# 进程间的通信 queue
from multiprocessing import Queue
q=Queue(4)
q.put()
q.get()
q.qsize()
q.empty()
q.full()
#线程关系
# 包含关系
#进程里面可以存着多个线程,多个线程可以共用进程资源
from threading import Thread
t=Thread(target=func,name='',args=(1,),kwargs='')
t.start()
相关推荐
阿成学长_Cain23 分钟前
Linux telinit 命令详解:运行级别切换|关机重启|系统维护一站式掌握
linux·运维·前端·网络
NiceCloud喜云1 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
qeen872 小时前
【Linux】指令补充与shell的简单介绍
linux·运维·服务器
阿成学长_Cain2 小时前
Linux talk 命令详解:经典终端实时聊天工具,无需图形界面即可对话
linux·运维·前端
一拳一个娘娘腔3 小时前
【后渗透-Linux篇】Linux 提权与逃逸:从 www-data到 root的蜕变
linux·运维·服务器
jieyucx3 小时前
零基础通关:Shell 编程核心语法全景详解
linux·运维·编程·shell
杨运交3 小时前
[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战
linux·运维·策略模式
shx_wei3 小时前
从函数调用到进程替换:使用 execl、CMake 与 PowerShell 构建一个多可执行程序
linux·c语言·windows·c
Dlrb12113 小时前
信息查询Web服务器-->电子商城信息查询项目
linux·服务器·数据库·html·嵌入式·epoll·数据查询
纳兰青华3 小时前
在 PVE 上通过 LXC 部署 Ubuntu 24.04:为 OpenClaw 打造轻量高效的 AI 环境
linux·ai编程