From 2398743ab9312ce65784b16980d35baf89499eb5 Mon Sep 17 00:00:00 2001 From: zj3D Date: Fri, 23 May 2025 18:41:52 +0800 Subject: [PATCH] 532-18 --- .../1 全局变量.py | 0 .../2 临时变量传递.py | 0 .../3 常见风格.py | 0 .../4 递归.py | 0 .../1 对象封装.py} | 0 .../2 字典仿真对象.py} | 0 .../3 对象接口/对象接口_引导.py} | 0 .../3 对象接口/对象接口_标准.py} | 3 +- .../{1 mapreduce.py => 4 mapreduce.py} | 0 .../2 松耦合/1 观察者/1 观察者.py | 2 +- .../1 消息接口.py | 0 .../2 消息驱动/2 消息队列.py} | 2 - .../2 调用链.py | 0 .../3 消息链.py | 0 .../4 管道封装}/1 嵌套调用.py | 0 .../4 管道封装}/2 方法bind.py | 0 .../4 管道封装}/3 重载管道.py | 0 .../4 管道封装}/4 类方法.py | 0 .../4 管道封装}/5 类方法.py | 0 .../1 队列.py => 1 数据队列.py} | 0 ...务进程_分包.py => 2 服务进程.py} | 10 ++- .../2 本地服务/服务进程_不合并.py | 62 ------------------- 22 files changed, 10 insertions(+), 69 deletions(-) rename A 动机与模式/11 封装/{函数封装 => 1 函数封装}/1 全局变量.py (100%) rename A 动机与模式/11 封装/{函数封装 => 1 函数封装}/2 临时变量传递.py (100%) rename A 动机与模式/11 封装/{函数封装 => 1 函数封装}/3 常见风格.py (100%) rename A 动机与模式/11 封装/{函数封装 => 1 函数封装}/4 递归.py (100%) rename A 动机与模式/11 封装/{对象封装/1 类对象.py => 2 对象封装/1 对象封装.py} (100%) rename A 动机与模式/11 封装/{对象封装/2 字典对象.py => 2 对象封装/2 字典仿真对象.py} (100%) rename A 动机与模式/11 封装/{对象封装/3 对象接口/tf-14A.py => 2 对象封装/3 对象接口/对象接口_引导.py} (100%) rename A 动机与模式/11 封装/{对象封装/3 对象接口/tf-14B.py => 2 对象封装/3 对象接口/对象接口_标准.py} (93%) rename A 动机与模式/12 语言特性/{1 mapreduce.py => 4 mapreduce.py} (100%) rename A 动机与模式/13 工程化考虑/2 松耦合/{2 消息链 => 2 消息驱动}/1 消息接口.py (100%) rename A 动机与模式/{14 多计算单元/数据共享/2 本地服务/4 消息队列.py => 13 工程化考虑/2 松耦合/2 消息驱动/2 消息队列.py} (96%) rename A 动机与模式/13 工程化考虑/2 松耦合/{2 消息链 => 2 消息驱动}/2 调用链.py (100%) rename A 动机与模式/13 工程化考虑/2 松耦合/{2 消息链 => 2 消息驱动}/3 消息链.py (100%) rename A 动机与模式/{11 封装/管道封装 => 13 工程化考虑/4 管道封装}/1 嵌套调用.py (100%) rename A 动机与模式/{11 封装/管道封装 => 13 工程化考虑/4 管道封装}/2 方法bind.py (100%) rename A 动机与模式/{11 封装/管道封装 => 13 工程化考虑/4 管道封装}/3 重载管道.py (100%) rename A 动机与模式/{11 封装/管道封装 => 13 工程化考虑/4 管道封装}/4 类方法.py (100%) rename A 动机与模式/{11 封装/管道封装 => 13 工程化考虑/4 管道封装}/5 类方法.py (100%) rename A 动机与模式/14 多计算单元/数据共享/{2 本地服务/1 队列.py => 1 数据队列.py} (100%) rename A 动机与模式/14 多计算单元/数据共享/{2 本地服务/服务进程_分包.py => 2 服务进程.py} (75%) delete mode 100644 A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_不合并.py diff --git a/A 动机与模式/11 封装/函数封装/1 全局变量.py b/A 动机与模式/11 封装/1 函数封装/1 全局变量.py similarity index 100% rename from A 动机与模式/11 封装/函数封装/1 全局变量.py rename to A 动机与模式/11 封装/1 函数封装/1 全局变量.py diff --git a/A 动机与模式/11 封装/函数封装/2 临时变量传递.py b/A 动机与模式/11 封装/1 函数封装/2 临时变量传递.py similarity index 100% rename from A 动机与模式/11 封装/函数封装/2 临时变量传递.py rename to A 动机与模式/11 封装/1 函数封装/2 临时变量传递.py diff --git a/A 动机与模式/11 封装/函数封装/3 常见风格.py b/A 动机与模式/11 封装/1 函数封装/3 常见风格.py similarity index 100% rename from A 动机与模式/11 封装/函数封装/3 常见风格.py rename to A 动机与模式/11 封装/1 函数封装/3 常见风格.py diff --git a/A 动机与模式/11 封装/函数封装/4 递归.py b/A 动机与模式/11 封装/1 函数封装/4 递归.py similarity index 100% rename from A 动机与模式/11 封装/函数封装/4 递归.py rename to A 动机与模式/11 封装/1 函数封装/4 递归.py diff --git a/A 动机与模式/11 封装/对象封装/1 类对象.py b/A 动机与模式/11 封装/2 对象封装/1 对象封装.py similarity index 100% rename from A 动机与模式/11 封装/对象封装/1 类对象.py rename to A 动机与模式/11 封装/2 对象封装/1 对象封装.py diff --git a/A 动机与模式/11 封装/对象封装/2 字典对象.py b/A 动机与模式/11 封装/2 对象封装/2 字典仿真对象.py similarity index 100% rename from A 动机与模式/11 封装/对象封装/2 字典对象.py rename to A 动机与模式/11 封装/2 对象封装/2 字典仿真对象.py diff --git a/A 动机与模式/11 封装/对象封装/3 对象接口/tf-14A.py b/A 动机与模式/11 封装/2 对象封装/3 对象接口/对象接口_引导.py similarity index 100% rename from A 动机与模式/11 封装/对象封装/3 对象接口/tf-14A.py rename to A 动机与模式/11 封装/2 对象封装/3 对象接口/对象接口_引导.py diff --git a/A 动机与模式/11 封装/对象封装/3 对象接口/tf-14B.py b/A 动机与模式/11 封装/2 对象封装/3 对象接口/对象接口_标准.py similarity index 93% rename from A 动机与模式/11 封装/对象封装/3 对象接口/tf-14B.py rename to A 动机与模式/11 封装/2 对象封装/3 对象接口/对象接口_标准.py index 42e6c94..4115501 100644 --- a/A 动机与模式/11 封装/对象封装/3 对象接口/tf-14B.py +++ b/A 动机与模式/11 封装/2 对象封装/3 对象接口/对象接口_标准.py @@ -74,8 +74,7 @@ IWordFrequencyCounter.register(subclass=WordFrequencyManager) # 应用类 # class WordFrequencyController: - def __init__(self, path_to_file): - # self._storage = DataStorageManager1(path_to_file) + def __init__(self, path_to_file): self.storage = DataStorageManager2(path_to_file) self.stop_word_manager = StopWordManager() self.word_freq_counter = WordFrequencyManager() diff --git a/A 动机与模式/12 语言特性/1 mapreduce.py b/A 动机与模式/12 语言特性/4 mapreduce.py similarity index 100% rename from A 动机与模式/12 语言特性/1 mapreduce.py rename to A 动机与模式/12 语言特性/4 mapreduce.py diff --git a/A 动机与模式/13 工程化考虑/2 松耦合/1 观察者/1 观察者.py b/A 动机与模式/13 工程化考虑/2 松耦合/1 观察者/1 观察者.py index b343db3..c320666 100644 --- a/A 动机与模式/13 工程化考虑/2 松耦合/1 观察者/1 观察者.py +++ b/A 动机与模式/13 工程化考虑/2 松耦合/1 观察者/1 观察者.py @@ -12,7 +12,7 @@ import collections from abc import ABC, abstractmethod from cppy.cp_util import * -# 定义观察者接口 ,在 Pyhon中并不是必须 +# 定义观察者接口 class Observer(ABC): @abstractmethod def update(self, word): diff --git a/A 动机与模式/13 工程化考虑/2 松耦合/2 消息链/1 消息接口.py b/A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/1 消息接口.py similarity index 100% rename from A 动机与模式/13 工程化考虑/2 松耦合/2 消息链/1 消息接口.py rename to A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/1 消息接口.py diff --git a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/4 消息队列.py b/A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/2 消息队列.py similarity index 96% rename from A 动机与模式/14 多计算单元/数据共享/2 本地服务/4 消息队列.py rename to A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/2 消息队列.py index 84e8c47..4f5261a 100644 --- a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/4 消息队列.py +++ b/A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/2 消息队列.py @@ -1,6 +1,4 @@ -################ 待整理 ''' -多线程各个模块比较乱的但是协作序贯的完成了数据处理 各个组件完全不能互操作,仅依靠队列发消息进行协作 适合环节多,数据可分块,有IO-计算性能设计考量要求,让各个模块自己适应调整 diff --git a/A 动机与模式/13 工程化考虑/2 松耦合/2 消息链/2 调用链.py b/A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/2 调用链.py similarity index 100% rename from A 动机与模式/13 工程化考虑/2 松耦合/2 消息链/2 调用链.py rename to A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/2 调用链.py diff --git a/A 动机与模式/13 工程化考虑/2 松耦合/2 消息链/3 消息链.py b/A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/3 消息链.py similarity index 100% rename from A 动机与模式/13 工程化考虑/2 松耦合/2 消息链/3 消息链.py rename to A 动机与模式/13 工程化考虑/2 松耦合/2 消息驱动/3 消息链.py diff --git a/A 动机与模式/11 封装/管道封装/1 嵌套调用.py b/A 动机与模式/13 工程化考虑/4 管道封装/1 嵌套调用.py similarity index 100% rename from A 动机与模式/11 封装/管道封装/1 嵌套调用.py rename to A 动机与模式/13 工程化考虑/4 管道封装/1 嵌套调用.py diff --git a/A 动机与模式/11 封装/管道封装/2 方法bind.py b/A 动机与模式/13 工程化考虑/4 管道封装/2 方法bind.py similarity index 100% rename from A 动机与模式/11 封装/管道封装/2 方法bind.py rename to A 动机与模式/13 工程化考虑/4 管道封装/2 方法bind.py diff --git a/A 动机与模式/11 封装/管道封装/3 重载管道.py b/A 动机与模式/13 工程化考虑/4 管道封装/3 重载管道.py similarity index 100% rename from A 动机与模式/11 封装/管道封装/3 重载管道.py rename to A 动机与模式/13 工程化考虑/4 管道封装/3 重载管道.py diff --git a/A 动机与模式/11 封装/管道封装/4 类方法.py b/A 动机与模式/13 工程化考虑/4 管道封装/4 类方法.py similarity index 100% rename from A 动机与模式/11 封装/管道封装/4 类方法.py rename to A 动机与模式/13 工程化考虑/4 管道封装/4 类方法.py diff --git a/A 动机与模式/11 封装/管道封装/5 类方法.py b/A 动机与模式/13 工程化考虑/4 管道封装/5 类方法.py similarity index 100% rename from A 动机与模式/11 封装/管道封装/5 类方法.py rename to A 动机与模式/13 工程化考虑/4 管道封装/5 类方法.py diff --git a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/1 队列.py b/A 动机与模式/14 多计算单元/数据共享/1 数据队列.py similarity index 100% rename from A 动机与模式/14 多计算单元/数据共享/2 本地服务/1 队列.py rename to A 动机与模式/14 多计算单元/数据共享/1 数据队列.py diff --git a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_分包.py b/A 动机与模式/14 多计算单元/数据共享/2 服务进程.py similarity index 75% rename from A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_分包.py rename to A 动机与模式/14 多计算单元/数据共享/2 服务进程.py index 319ab95..3042b65 100644 --- a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_分包.py +++ b/A 动机与模式/14 多计算单元/数据共享/2 服务进程.py @@ -2,9 +2,15 @@ 使用 multiprocessing.Manager: Manager 提供了一个可以在不同进程之间共享和修改的数据类型,如 list, dict, Namespace 等。 它实际上是在背后启动了一个单独的服务器进程,其他进程通过代理来访问这些共享对象。 + +怎么得到最快的一个结果,是一个试错过程:X程创建数目多少、分片的大小 ... + +使用 multiprocessing.Manager 来完成统计词频 +需要注意: + - Manager() 必须用函数包起来,不能按脚本随便放外面,否则会提示freeze_support + - 工作函数需要放到外面,不能做内部函数。否则会提示参数错误 + - 无法在 Jupyter 类似环境运行 ''' -# 使用 multiprocessing.Manager 来完成统计词频 -# 怎么得到最快的一个结果,是一个试错过程:X程创建数目多少、分片的大小 ... from cppy.cp_util import * from collections import Counter diff --git a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_不合并.py b/A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_不合并.py deleted file mode 100644 index a047b1b..0000000 --- a/A 动机与模式/14 多计算单元/数据共享/2 本地服务/服务进程_不合并.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -使用 multiprocessing.Manager: -Manager 提供了一个可以在不同进程之间共享和修改的数据类型,如 list, dict, Namespace 等。 -它实际上是在背后启动了一个单独的服务器进程,其他进程通过代理来访问这些共享对象。 - -使用 multiprocessing.Manager 来完成统计词频 -需要注意: - - Manager() 必须用函数包起来,不能按脚本随便放外面,否则会提示freeze_support - - 工作函数需要放到外面,不能做内部函数。否则会提示参数错误 - - 无法在 Jupyter 类似环境运行 -''' - -from cppy.cp_util import * -from collections import Counter -from multiprocessing import Manager, Process - -stop_words = get_stopwords() - -def process_chunk(shared_chunks,word_count): - while True: - try: - chunk = shared_chunks.pop(0) # 从共享列表中取出一个数据块 - if chunk is None: break # 如果取出的是None,表示所有数据块已处理完毕 - words = extract_str_words(chunk) - for word in words: - if word not in stop_words: - word_count[word] = word_count.get(word, 0) + 1 - except Exception as e: - print(e) - break - - -@timing_decorator -def main(): - # 创建一个Manager实例 - manager = Manager() - shared_chunks = manager.list() - word_count = manager.dict() - - # 读取文件并按块大小分割,将块添加到共享列表中 - chunk_size = 1024 * 10 # 假设每个块是10KB,可以根据需要调整 - with open(testfilepath, 'r', encoding='utf-8') as f: - while True: - chunk = f.read(chunk_size) - if not chunk: break - shared_chunks.append(chunk) - shared_chunks.append(None) - print('-------------------',len(shared_chunks)) - processes = [ Process( target=process_chunk, - args=(shared_chunks,word_count)) - for _ in range( 4 ) ] # 假设启动4个工作进程 - for p in processes: p.start() - for p in processes: p.join() - - # 将Manager类型的字典转换为普通的字典,以便使用Counter - word_count = dict(word_count) - word_freqs = Counter(word_count).most_common(10) - print_word_freqs(word_freqs) - - -if __name__ == '__main__': - main() \ No newline at end of file