python 共享内存 list_multiprocessing.shared_memory

3.8 新版功能.

该模块提供了一个 SharedMemory 类,用于分配和管理多核或对称多处理器(SMP)机器上进程间的共享内存。为了协助管理不同进程间的共享内存生命周期,multiprocessing.managers 模块也提供了一个 BaseManager 的子类: SharedMemoryManager。

本模块中,共享内存是指 "System V 类型" 的共享内存块(虽然实现方式可能不完全一致)而不是 “分布式共享内存”。这种类型的的共享内存允许不同进程读写一片公共(或者共享)的易失性存储区域。一般来说,进程被限制只能访问属于自己进程空间的内存,但是共享内存允许跨进程共享数据,从而避免通过进程间发送消息的形式传递数据。与通过磁盘、套接字或者其他要求序列化、反序列化和复制数据的共享形式相比,直接通过内存共享数据拥有更出色的性能。

classmultiprocessing.shared_memory.SharedMemory(name=None, create=False, size=0)¶

创建一个新的共享内存块或者连接到一片已经存在的共享内存块。每个共享内存块都被指定了一个全局唯一的名称。通过这种方式,进程可以使用一个特定的名字创建共享内存区块,然后其他进程使用同样的名字连接到这个共享内存块。

作为一种跨进程共享数据的方式,共享内存块的寿命可能超过创建它的原始进程。一个共享内存块可能同时被多个进程使用,当一个进程不再需要访问这个共享内存块的时候,应该调用 close() 方法。当一个共享内存块不被任何进程使用的时候,应该调用 unlink() 方法以保证必要的清理。

name 是共享内存的唯一名称,字符串类型。如果创建一个新共享内存块的时候,名称指定为 None (默认值),将会随机产生一个新名称。

create 指定创建一个新的共享内存块 (True) 还是连接到已存在的共享内存块 (False) 。

如果是新创建共享内存块则 size 用于指定块的大小为多少字节。由于某些平台是以内存页大小为最小单位来分配内存的,最终得到的内存块大小可能大于或等于要求的大小。如果是连接到已经存在的共享内存块, size 参数会被忽略。

close()¶

关闭实例对于共享内存的访问连接。所有实例确认自己不再需要使用共享内存的时候都应该调用 close() ,以保证必要的资源清理。调用 close() 并不会销毁共享内存区域。

unlink()¶

请求销毁底层的共享内存块。为了执行必要的资源清理, 在所有使用这个共享内存块的进程中, unlink() 应该调用一次(且只能调用一次) 。发出此销毁请求后,共享内存块可能会、也可能不会立即销毁,且此行为在不同操作系统之间可能不同。调用 unlink() 后再尝试方位其中的数据可能导致内存错误。注意: 最后一个关闭共享内存访问权限的进程可以以任意顺序调用 unlink() 和 close() 。

buf¶

共享内存块内容的 memoryview 。

name¶

共享内存块的唯一标识,只读属性。

size¶

共享内存块的字节大小,只读属性。

以下示例展示了 SharedMemory 底层的用法:

>>>from multiprocessing import shared_memory

>>>shm_a = shared_memory.SharedMemory(create=True, size=10)

>>>type(shm_a.buf)

>>>buffer = shm_a.buf

>>>len(

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import time import multiprocessing from proxypool.processors.server import app from proxypool.processors.getter import Getter from proxypool.processors.tester import Tester from proxypool.setting import CYCLE_GETTER, CYCLE_TESTER, API_HOST, API_THREADED, API_PORT, ENABLE_SERVER, \ ENABLE_GETTER, ENABLE_TESTER, IS_WINDOWS from loguru import logger if IS_WINDOWS: multiprocessing.freeze_support() tester_process, getter_process, server_process = None, None, None class Scheduler(): def run_tester(self, cycle=CYCLE_TESTER): if not ENABLE_TESTER: logger.info('tester not enabled, exit') return tester = Tester() loop = 0 while True: logger.debug(f'tester loop {loop} start...') tester.run() loop += 1 time.sleep(cycle) # CYCLE_GETTER=100 def run_getter(self, cycle=CYCLE_GETTER): if not ENABLE_GETTER: logger.info('getter not enabled, exit') return getter = Getter() loop = 0 while True: logger.debug(f'getter loop {loop} start...') getter.run() loop += 1 time.sleep(cycle) def run_server(self): if not ENABLE_SERVER: logger.info('server not enabled, exit') return app.run(host=API_HOST, port=API_PORT, threaded=API_THREADED) def run(self): global tester_process, getter_process, server_process try: logger.info('starting proxypool...') if ENABLE_TESTER: tester_process = multiprocessing.Process(target=self.run_tester) logger.info(f'starting tester, pid {tester_process.pid}...') tester_process.start() if ENABLE_GETTER: getter_process = multiprocessing.Process(target=self.run_getter) logger.info(f'starting getter, pid{getter_process.pid}...') getter_process.start() if ENABLE_SERVER: server_process = multiprocessing.Process(target=self.run_server) logger.info(f'starting server, pid{server_process.pid}...') server_process.start() tester_process.join() getter_process.join() server_process.join() except KeyboardInterrupt: logger.info('received keyboard interrupt signal') tester_process.terminate() getter_process.terminate() server_process.terminate() finally: # must call join method before calling is_alive tester_process.join() getter_process.join() server_process.join() logger.info(f'tester is {"alive" if tester_process.is_alive() else "dead"}') logger.info(f'getter is {"alive" if getter_process.is_alive() else "dead"}') logger.info(f'server is {"alive" if server_process.is_alive() else "dead"}') logger.info('proxy terminated') if name == 'main': scheduler = Scheduler() scheduler.run()给这段代码加注释
06-09
这段代码是一个代理池的调度程序,用于获取代理IP并测试其可用性。下面是对代码的详细注释: ```python import time import multiprocessing from proxypool.processors.server import app # 导入 server 模块 from proxypool.processors.getter import Getter # 导入 getter 模块 from proxypool.processors.tester import Tester # 导入 tester 模块 from proxypool.setting import CYCLE_GETTER, CYCLE_TESTER, API_HOST, API_THREADED, API_PORT, ENABLE_SERVER, ENABLE_GETTER, ENABLE_TESTER, IS_WINDOWS # 导入配置文件 from loguru import logger # 导入日志库 if IS_WINDOWS: multiprocessing.freeze_support() # Windows 平台需要调用这个函数 tester_process, getter_process, server_process = None, None, None # 定义进程对象 class Scheduler(): def run_tester(self, cycle=CYCLE_TESTER): # 定义 tester 进程的运行函数 if not ENABLE_TESTER: # 若不需要测试,则直接退出 logger.info('tester not enabled, exit') return tester = Tester() loop = 0 while True: logger.debug(f'tester loop {loop} start...') tester.run() # 运行 tester loop += 1 time.sleep(cycle) # 循环周期 def run_getter(self, cycle=CYCLE_GETTER): # 定义 getter 进程的运行函数 if not ENABLE_GETTER: # 若不需要获取,则直接退出 logger.info('getter not enabled, exit') return getter = Getter() loop = 0 while True: logger.debug(f'getter loop {loop} start...') getter.run() # 运行 getter loop += 1 time.sleep(cycle) # 循环周期 def run_server(self): # 定义 server 进程的运行函数 if not ENABLE_SERVER: # 若不需要启动 server,则直接退出 logger.info('server not enabled, exit') return app.run(host=API_HOST, port=API_PORT, threaded=API_THREADED) # 运行 server def run(self): # 定义调度程序的运行函数 global tester_process, getter_process, server_process # 定义全局变量 try: logger.info('starting proxypool...') if ENABLE_TESTER: # 若需要测试,则启动 tester 进程 tester_process = multiprocessing.Process(target=self.run_tester) logger.info(f'starting tester, pid {tester_process.pid}...') tester_process.start() if ENABLE_GETTER: # 若需要获取,则启动 getter 进程 getter_process = multiprocessing.Process(target=self.run_getter) logger.info(f'starting getter, pid{getter_process.pid}...') getter_process.start() if ENABLE_SERVER: # 若需要启动 server,则启动 server 进程 server_process = multiprocessing.Process(target=self.run_server) logger.info(f'starting server, pid{server_process.pid}...') server_process.start() tester_process.join() # 等待 tester 进程结束 getter_process.join() # 等待 getter 进程结束 server_process.join() # 等待 server 进程结束 except KeyboardInterrupt: # 捕获键盘中断信号 logger.info('received keyboard interrupt signal') tester_process.terminate() # 终止 tester 进程 getter_process.terminate() # 终止 getter 进程 server_process.terminate() # 终止 server 进程 finally: # 无论如何都要关闭进程 tester_process.join() # 等待 tester 进程结束 getter_process.join() # 等待 getter 进程结束 server_process.join() # 等待 server 进程结束 logger.info(f'tester is {"alive" if tester_process.is_alive() else "dead"}') logger.info(f'getter is {"alive" if getter_process.is_alive() else "dead"}') logger.info(f'server is {"alive" if server_process.is_alive() else "dead"}') logger.info('proxy terminated') if __name__ == '__main__': scheduler = Scheduler() scheduler.run() # 运行调度程序 ``` 这段代码中启动了三个进程:tester 进程用于测试代理 IP 的可用性,getter 进程用于获取代理 IP,server 进程用于提供代理 IP 的 API 接口。其中,每个进程都有自己的运行函数,它们会循环运行并在一定时间间隔内执行一次相应的操作。如果不需要某个进程,则会直接退出。调度程序会等待所有进程运行结束,并在捕获到键盘中断信号时及时关闭进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值