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()
相关推荐
黎宇幻生3 小时前
Java全栈学习笔记39
java·笔记·学习
liujing102329293 小时前
stm32大项目阶段20251015
linux
嵌入式郑工4 小时前
LINUX驱动开发: 设备和驱动是怎么匹配的?
linux·运维·服务器
rain bye bye5 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
郭式云源生法则5 小时前
归档及压缩、重定向与管道操作和综合使用,find精确查找、find处理查找结果、vim高级使用、vimdiff多文件使用
linux·运维·服务器
一张假钞5 小时前
Ubuntu 24.04 安装 Jenkins
linux·ci/cd·jenkins
tuokuac6 小时前
查看你电脑上某个端口正在被哪个进程占用
linux
小池先生6 小时前
服务请求出现偶发超时问题,经查服务本身没问题,问题出现在nginx转发。
运维·服务器·nginx
MANONGMN6 小时前
Linux 通配符与正则表达式(含实战案例+避坑指南)
linux·运维·正则表达式
遇印记6 小时前
大二java学习笔记:二维数组
java·笔记·学习