From cd8186dd6864b0d5e52ce495efc60ca81a47c9e1 Mon Sep 17 00:00:00 2001 From: zj3D Date: Thu, 21 Mar 2024 00:12:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E4=BF=AE=2010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../数据共享/1 队列.py | 11 ++++- .../数据共享/2 服务进程.py | 43 ++++++++++++++++++ .../数据分包/mapreduce.py | 0 .../数据分包/多线程.py | 0 .../数据分包/多进程.py | 0 .../数据分包/抽象并发.py | 0 .../数据共享/1 文件共享.py | 2 - 13 计算设备/数据共享/4 网络.py | 0 .../数据库}/ORM/DataQuery.py | 0 .../数据库}/ORM/createDb.py | 0 .../数据库}/ORM/processData.py | 0 .../2 数据库 => 16 其它/数据库}/tf.db | Bin .../数据库}/数据库.py | 0 13 files changed, 53 insertions(+), 3 deletions(-) rename 13 计算设备/数据共享/3 内存队列.py => 13 多计算单元/数据共享/1 队列.py (65%) create mode 100644 13 多计算单元/数据共享/2 服务进程.py rename {13 计算设备 => 13 多计算单元}/数据分包/mapreduce.py (100%) rename {13 计算设备 => 13 多计算单元}/数据分包/多线程.py (100%) rename {13 计算设备 => 13 多计算单元}/数据分包/多进程.py (100%) rename {13 计算设备 => 13 多计算单元}/数据分包/抽象并发.py (100%) delete mode 100644 13 计算设备/数据共享/1 文件共享.py delete mode 100644 13 计算设备/数据共享/4 网络.py rename {13 计算设备/数据共享/2 数据库 => 16 其它/数据库}/ORM/DataQuery.py (100%) rename {13 计算设备/数据共享/2 数据库 => 16 其它/数据库}/ORM/createDb.py (100%) rename {13 计算设备/数据共享/2 数据库 => 16 其它/数据库}/ORM/processData.py (100%) rename {13 计算设备/数据共享/2 数据库 => 16 其它/数据库}/tf.db (100%) rename {13 计算设备/数据共享/2 数据库 => 16 其它/数据库}/数据库.py (100%) diff --git a/13 计算设备/数据共享/3 内存队列.py b/13 多计算单元/数据共享/1 队列.py similarity index 65% rename from 13 计算设备/数据共享/3 内存队列.py rename to 13 多计算单元/数据共享/1 队列.py index 4154687..fc0bc89 100644 --- a/13 计算设备/数据共享/3 内存队列.py +++ b/13 多计算单元/数据共享/1 队列.py @@ -43,4 +43,13 @@ def main(): counter.run() if __name__ == '__main__': - main() \ No newline at end of file + main() + +''' +在多线程之间传递数据,建议使用线程安全的队列,如queue.Queue或multiprocessing.Queue(后者也适用于多进程环境)。 +这些队列提供了线程安全的数据传输机制,可以避免竞态条件和数据损坏。 +全局变量不可预测 + +multiprocessing.Queue在Python中的底层实现并不直接依赖于文件系统。它利用了操作系统提供的进程间通信(IPC, Inter-Process Communication)机制,具体实现取决于不同操作系统的支持。 +在Unix/Linux系统中,multiprocessing.Queue通常基于管道(pipes)、共享内存和/或消息队列等机制实现。而在Windows系统上,可能使用命名管道(named pipes)或者内存映射文件(memory-mapped files),以及某些版本的Windows特有的进程间同步对象如Mutexes、Semaphores和事件。 +''' \ No newline at end of file diff --git a/13 多计算单元/数据共享/2 服务进程.py b/13 多计算单元/数据共享/2 服务进程.py new file mode 100644 index 0000000..138746a --- /dev/null +++ b/13 多计算单元/数据共享/2 服务进程.py @@ -0,0 +1,43 @@ +''' +使用 multiprocessing.Manager: +Manager 提供了一个可以在不同进程之间共享和修改的数据类型,如 list, dict, Namespace 等。 +它实际上是在背后启动了一个单独的服务器进程,其他进程通过代理来访问这些共享对象。 +''' +# 使用 multiprocessing.Manager 来完成统计词频 +# 用消费者模式更好 + +from cppy.cp_util import * +from collections import Counter +from multiprocessing import Manager, Process + +stop_words = get_stopwords() + +def count_words(chunk,word_count): + words = [ w for w in chunk if ( not w in stop_words ) and len(w) >= 3 ] + for word in words: + word_count[word] = word_count.get(word, 0) + 1 + # word_count.update( Counter(words) ) # 类型不起作用 + +@timing_decorator +def main(): + manager = Manager() + word_count = manager.dict() + + chunks = get_chunks(testfilepath) + processes = [] + for chunk in chunks: + p = Process(target=count_words, args=(chunk,word_count)) + processes.append(p) + p.start() + + for p in processes: p.join() + + sorted_word_count = sorted(word_count.items(), key=lambda x: x[1], reverse=True) + top_10_words = sorted_word_count[:10] + + print("频率最高的10个词:") + for word, count in top_10_words: + print(f"{word}: {count}") + +if __name__ == '__main__': + main() diff --git a/13 计算设备/数据分包/mapreduce.py b/13 多计算单元/数据分包/mapreduce.py similarity index 100% rename from 13 计算设备/数据分包/mapreduce.py rename to 13 多计算单元/数据分包/mapreduce.py diff --git a/13 计算设备/数据分包/多线程.py b/13 多计算单元/数据分包/多线程.py similarity index 100% rename from 13 计算设备/数据分包/多线程.py rename to 13 多计算单元/数据分包/多线程.py diff --git a/13 计算设备/数据分包/多进程.py b/13 多计算单元/数据分包/多进程.py similarity index 100% rename from 13 计算设备/数据分包/多进程.py rename to 13 多计算单元/数据分包/多进程.py diff --git a/13 计算设备/数据分包/抽象并发.py b/13 多计算单元/数据分包/抽象并发.py similarity index 100% rename from 13 计算设备/数据分包/抽象并发.py rename to 13 多计算单元/数据分包/抽象并发.py diff --git a/13 计算设备/数据共享/1 文件共享.py b/13 计算设备/数据共享/1 文件共享.py deleted file mode 100644 index 8ac399e..0000000 --- a/13 计算设备/数据共享/1 文件共享.py +++ /dev/null @@ -1,2 +0,0 @@ - -# 文件或者共享变量 \ No newline at end of file diff --git a/13 计算设备/数据共享/4 网络.py b/13 计算设备/数据共享/4 网络.py deleted file mode 100644 index e69de29..0000000 diff --git a/13 计算设备/数据共享/2 数据库/ORM/DataQuery.py b/16 其它/数据库/ORM/DataQuery.py similarity index 100% rename from 13 计算设备/数据共享/2 数据库/ORM/DataQuery.py rename to 16 其它/数据库/ORM/DataQuery.py diff --git a/13 计算设备/数据共享/2 数据库/ORM/createDb.py b/16 其它/数据库/ORM/createDb.py similarity index 100% rename from 13 计算设备/数据共享/2 数据库/ORM/createDb.py rename to 16 其它/数据库/ORM/createDb.py diff --git a/13 计算设备/数据共享/2 数据库/ORM/processData.py b/16 其它/数据库/ORM/processData.py similarity index 100% rename from 13 计算设备/数据共享/2 数据库/ORM/processData.py rename to 16 其它/数据库/ORM/processData.py diff --git a/13 计算设备/数据共享/2 数据库/tf.db b/16 其它/数据库/tf.db similarity index 100% rename from 13 计算设备/数据共享/2 数据库/tf.db rename to 16 其它/数据库/tf.db diff --git a/13 计算设备/数据共享/2 数据库/数据库.py b/16 其它/数据库/数据库.py similarity index 100% rename from 13 计算设备/数据共享/2 数据库/数据库.py rename to 16 其它/数据库/数据库.py