From 38c2a02562fe573c8a612bdb334f5f48356a1b8e Mon Sep 17 00:00:00 2001 From: Alicia Date: Tue, 25 Feb 2020 12:27:19 +0800 Subject: [PATCH 1/8] fix typo --- chapter3/03_How_to_name_a_process.rst | 2 +- chapter3/07_How_to_exchange_objects_between_processes.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chapter3/03_How_to_name_a_process.rst b/chapter3/03_How_to_name_a_process.rst index b4698de..9cb03dd 100644 --- a/chapter3/03_How_to_name_a_process.rst +++ b/chapter3/03_How_to_name_a_process.rst @@ -42,7 +42,7 @@ |work| ------ -这个过程明明线程很像。明明进程需要为进程对象提供 ``name`` 参数: :: +这个过程和命名线程很像。命名进程需要为进程对象提供 ``name`` 参数: :: process_with_name = multiprocessing.Process(name='foo_process', target=foo) diff --git a/chapter3/07_How_to_exchange_objects_between_processes.rst b/chapter3/07_How_to_exchange_objects_between_processes.rst index 70a1298..880a0f7 100644 --- a/chapter3/07_How_to_exchange_objects_between_processes.rst +++ b/chapter3/07_How_to_exchange_objects_between_processes.rst @@ -114,7 +114,7 @@ item = random.randint(0, 256) self.queue.put(item) -消费者进程负责使用 ``get()`` 方法从队列中移除item,并且确认队列是否为空,如果为空,就执行 ``break`` 跳出 ``whild`` 循环: :: +消费者进程负责使用 ``get()`` 方法从队列中移除item,并且确认队列是否为空,如果为空,就执行 ``break`` 跳出 ``while`` 循环: :: def run(self): while True: From a152c56284dbb10dba27da6c94524d1cd42109e6 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Sat, 11 Apr 2020 17:14:24 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=20=E9=9D=9E=E9=85=8D=20->=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chapter1/03_Memory_organization.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapter1/03_Memory_organization.rst b/chapter1/03_Memory_organization.rst index 1d0c3fd..76845e3 100644 --- a/chapter1/03_Memory_organization.rst +++ b/chapter1/03_Memory_organization.rst @@ -71,11 +71,11 @@ MPP 机器由上百个处理器 (在一些机器中达到成千上万个) 通过 - 负载均衡集群 (The load balancing cluster) :在这类系统中,会将一个作业请求发送给负载较小的节点上执行。这样做可以减少整个处理过程所耗费的时间。 -- 高性能计算集群 (The high-performance cluster) :在这类系统中,每个节点都可以提供极高的性能,一个任务依旧分解为若干个子任务交给各个节点处理。任务是并行化的,非配给不同的机器进行处理。 +- 高性能计算集群 (The high-performance cluster) :在这类系统中,每个节点都可以提供极高的性能,一个任务依旧分解为若干个子任务交给各个节点处理。任务是并行化的,分配给不同的机器进行处理。 异构架构 >>>>>>>> 在同构的超级计算机中采用GPU加速器改变了之前超级计算机的使用规则。即使GPU能够提供高性能计算,但是不能把它看作一个独立的处理单元,因为GPU必须在CPU的配合下才能顺利完成工作。因此,异构计算的程序设计方法很简单,首先CPU通过多种方式计算和控制任务,将计算密集型和具有高并行性的任务分配给图形加速卡执行。CPU和GPU之间不仅可以通过高速总线通讯,也可以通过共享一块虚拟内存或物理内存通讯。事实上,在这类设备上GPU和CPU都没有独立的内存区域,一般是通过由各种编程框架(如CUDA,OpenCL)提供的库来操作内存。这类架构被称之为异构架构,在这种架构中,应用程序可以在单一的地址空间中创建数据结构,然后将任务分配给合适的硬件执行。通过原子性操作,多个任务可以安全地操控同一个内存区域同时避免数据一致性问题。所以,尽管CPU和GPU看起来不能高效联合工作,但通过新的架构可以优化它们之间的交互和提高并行程序的性能。 -.. image:: ../images/Page-13-Image-1.png \ No newline at end of file +.. image:: ../images/Page-13-Image-1.png From dc14176cba760724d157669e95abb9381685f484 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Sat, 18 Apr 2020 01:35:10 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chapter2/05_How_to_use_a_thread_in_a_subclass.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter2/05_How_to_use_a_thread_in_a_subclass.rst b/chapter2/05_How_to_use_a_thread_in_a_subclass.rst index 4559b60..5dd2f8c 100644 --- a/chapter2/05_How_to_use_a_thread_in_a_subclass.rst +++ b/chapter2/05_How_to_use_a_thread_in_a_subclass.rst @@ -63,6 +63,6 @@ |work| ------ -``threading``模块是创建和管理线程的首选形式。每一个线程都通过一个继承 ``Thread`` 类,重写 ``run()`` 方法来实现逻辑,这个方法是线程的入口。在主程序中,我们创建了多个 ``myThread`` 的类型实例,然后执行 ``start()`` 方法启动它们。调用 ``Thread.__init__`` 构造器方法是必须的,通过它我们可以给线程定义一些名字或分组之类的属性。调用 ``start()`` 之后线程变为活跃状态,并且持续直到 ``run()`` 结束,或者中间出现异常。所有的线程都执行完成之后,程序结束。 +``threading`` 模块是创建和管理线程的首选形式。每一个线程都通过一个继承 ``Thread`` 类,重写 ``run()`` 方法来实现逻辑,这个方法是线程的入口。在主程序中,我们创建了多个 ``myThread`` 的类型实例,然后执行 ``start()`` 方法启动它们。调用 ``Thread.__init__`` 构造器方法是必须的,通过它我们可以给线程定义一些名字或分组之类的属性。调用 ``start()`` 之后线程变为活跃状态,并且持续直到 ``run()`` 结束,或者中间出现异常。所有的线程都执行完成之后,程序结束。 ``join()`` 命令控制主线程的终止。 From bbcd78448660339aef587a77961e4dd0b74061c6 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Sat, 18 Apr 2020 11:29:17 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E8=AF=95=E7=94=A8=20->=20=E4=BD=BF=E7=94=A8=20(#78?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chapter2/03_how_to_define_a_thread.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapter2/03_how_to_define_a_thread.rst b/chapter2/03_how_to_define_a_thread.rst index 72e8fc7..6f933a2 100644 --- a/chapter2/03_how_to_define_a_thread.rst +++ b/chapter2/03_how_to_define_a_thread.rst @@ -14,8 +14,8 @@ - ``group``: 一般设置为 ``None`` ,这是为以后的一些特性预留的 - ``target``: 当线程启动的时候要执行的函数 - ``name``: 线程的名字,默认会分配一个唯一名字 ``Thread-N`` -- ``args``: 传递给 ``target`` 的参数,要试用tuple类型 -- ``kwargs``: 同上,试用字典类型dict +- ``args``: 传递给 ``target`` 的参数,要使用tuple类型 +- ``kwargs``: 同上,使用字典类型dict 创建线程的方法非常实用,通过`target`参数、`arg`和`kwarg`告诉线程应该做什么。下面这个例子传递一个数字给线程(这个数字正好等于线程号码),目标函数会打印出这个数字。 From 79d2951bbf453b6ed1eacce08b0b56d7e3f07c01 Mon Sep 17 00:00:00 2001 From: Xiangmingzhe Date: Thu, 24 Sep 2020 05:11:38 -0500 Subject: [PATCH 5/8] fix typo (#84) --- chapter4/03_Event_loop_management_with_Asyncio.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter4/03_Event_loop_management_with_Asyncio.rst b/chapter4/03_Event_loop_management_with_Asyncio.rst index 87dc957..00f76ba 100644 --- a/chapter4/03_Event_loop_management_with_Asyncio.rst +++ b/chapter4/03_Event_loop_management_with_Asyncio.rst @@ -21,7 +21,7 @@ Python的Asyncio模块提供了管理事件、协程、任务和线程的方法 processEvent(e); } -所有的时间都在 ``while`` 循环中捕捉,然后经过事件处理者处理。事件处理的部分是系统唯一活跃的部分,当一个事件处理完成,流程继续处理下一个事件。 +所有的事件都在 ``while`` 循环中捕捉,然后经过事件处理者处理。事件处理的部分是系统唯一活跃的部分,当一个事件处理完成,流程继续处理下一个事件。 |ready| ------- From 2885afb2c2f249c087739a99f75e4a52cccc58ee Mon Sep 17 00:00:00 2001 From: zenghsh3 Date: Tue, 3 Nov 2020 15:40:38 +0800 Subject: [PATCH 6/8] Update 01_Introduction.rst (#85) --- chapter5/01_Introduction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter5/01_Introduction.rst b/chapter5/01_Introduction.rst index 822e6ce..5c3fade 100644 --- a/chapter5/01_Introduction.rst +++ b/chapter5/01_Introduction.rst @@ -5,4 +5,4 @@ 采用这种技术产生的根本问题是对各种类型的流量(数据,任务,命令等)进行适当的分配。此外,还有一个分布式系统基础特征产生的问题:网络由不同操作系统的计算机组成,很多互不兼容。实际上,随着时间的推移,为了使用分布式环境中的不同资源,已经可以识别不同的计算模型。他们的目标是提供一个框架,为一个分布式应用的不同处理器之间描述合作方法。 -我们可以说,基本上各种模型的不同点是分布式系统能提供的容量的大小。最常用的模型是服务器/客户端模型。它可以让不同的进程运行在不同的计算机上,通过交换教习进行实时的合作。相对于前一个模型有很大的提高,前一个模型要求将所有的文件分发到所有的机器上,从而进行离线的计算。客户端/服务器模型典型的实现是通过远程的程序调用(这是本地调用的扩展),或者通过分布式对象的程序(面向对象的中间件)。本章将介绍一些Python提供的类似的计算架构。然后我们会介绍一些用OO的方法或远程调用实现了分布式架构的库,例如 Celery,SCOOP, Pyro4 和 RPyC,也有一些使用了不同方法的库,例如 PyCSP 和Disco,Python版本的 MapReduce 算法。 +我们可以说,基本上各种模型的不同点是分布式系统能提供的容量的大小。最常用的模型是服务器/客户端模型。它可以让不同的进程运行在不同的计算机上,通过交换消息进行实时的合作。相对于前一个模型有很大的提高,前一个模型要求将所有的文件分发到所有的机器上,从而进行离线的计算。客户端/服务器模型典型的实现是通过远程的程序调用(这是本地调用的扩展),或者通过分布式对象的程序(面向对象的中间件)。本章将介绍一些Python提供的类似的计算架构。然后我们会介绍一些用OO的方法或远程调用实现了分布式架构的库,例如 Celery,SCOOP, Pyro4 和 RPyC,也有一些使用了不同方法的库,例如 PyCSP 和Disco,Python版本的 MapReduce 算法。 From 9593e62886729fa54f49a1db743bd995403e2032 Mon Sep 17 00:00:00 2001 From: Bestporter <32806123+Bestporter@users.noreply.github.com> Date: Tue, 3 May 2022 01:14:20 +0800 Subject: [PATCH 7/8] Update 07_How_to_exchange_objects_between_processes.rst (#89) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改Joinablequeue,[官方文档](https://docs.python.org/zh-cn/3.8/library/multiprocessing.html?highlight=joinablequeue#multiprocessing.JoinableQueue) --- chapter3/07_How_to_exchange_objects_between_processes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapter3/07_How_to_exchange_objects_between_processes.rst b/chapter3/07_How_to_exchange_objects_between_processes.rst index 880a0f7..aaf1f53 100644 --- a/chapter3/07_How_to_exchange_objects_between_processes.rst +++ b/chapter3/07_How_to_exchange_objects_between_processes.rst @@ -130,7 +130,7 @@ |more| ------ -队列还有一个 ``JoinaleQueue`` 子类,它有以下两个额外的方法: +队列还有一个 ``JoinableQueue`` 子类,它有以下两个额外的方法: - ``task_done()``: 此方法意味着之前入队的一个任务已经完成,比如, ``get()`` 方法从队列取回item之后调用。所以此方法只能被队列的消费者调用。 - ``join()``: 此方法将进程阻塞,直到队列中的item全部被取出并执行。 From 1929fa75117baad063b5b3678a4e7a605beec441 Mon Sep 17 00:00:00 2001 From: CatfishWen Date: Wed, 13 Mar 2024 09:53:14 +0800 Subject: [PATCH 8/8] fix typo (#92) --- .../05_How_to_design_a_parallel_program.rst | 2 +- chapter1/07_Introducing_Python.rst | 39 +++++++++++-------- ...Start_working_with_processes_in_Python.rst | 2 +- ...ow_to_manage_a_state_between_processes.rst | 2 +- .../03_Event_loop_management_with_Asyncio.rst | 2 +- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/chapter1/05_How_to_design_a_parallel_program.rst b/chapter1/05_How_to_design_a_parallel_program.rst index f057e59..06f432d 100644 --- a/chapter1/05_How_to_design_a_parallel_program.rst +++ b/chapter1/05_How_to_design_a_parallel_program.rst @@ -39,7 +39,7 @@ - 可以并行执行的任务应该由多个处理器处理以增强并行性。 -这就是所谓的映射问题,也是一个NP完全问题——一般情况下不能再多项式时间内解决的问题。在大小相等和通讯模式容易定义的任务中,映射很直接 (在这里也可以执行聚合的步骤来合并映射到相同处理器的任务)。但是如果任务的通讯模式难以预测或者每个任务的工作量都不一样,设计一个高效的映射和聚合架构就会变得有难度。由于存在这些问题,负载均衡算法会在运行时识别聚合和映射策略。最难的问题是在程序执行期间通信量或任务数量改变的问题。针对这些问题,可以使用在执行过程中周期性运行的动态负载均衡算法。 +这就是所谓的映射问题,也是一个NP完全问题——一般情况下不能在多项式时间内解决的问题。在大小相等和通讯模式容易定义的任务中,映射很直接 (在这里也可以执行聚合的步骤来合并映射到相同处理器的任务)。但是如果任务的通讯模式难以预测或者每个任务的工作量都不一样,设计一个高效的映射和聚合架构就会变得有难度。由于存在这些问题,负载均衡算法会在运行时识别聚合和映射策略。最难的问题是在程序执行期间通信量或任务数量改变的问题。针对这些问题,可以使用在执行过程中周期性运行的动态负载均衡算法。 动态映射 -------- diff --git a/chapter1/07_Introducing_Python.rst b/chapter1/07_Introducing_Python.rst index d6051d0..0d73826 100644 --- a/chapter1/07_Introducing_Python.rst +++ b/chapter1/07_Introducing_Python.rst @@ -54,7 +54,8 @@ Python可以从这里下载:https://www.python.org/downloads/ - 字符串操作: :: - >>> word = 'Help' + 'A' >>> word + >>> word = 'Help' + 'A' + >>> word 'HelpA' >>> word[4] 'A' @@ -65,7 +66,8 @@ Python可以从这里下载:https://www.python.org/downloads/ - 列表(list)操作: :: - >>> a = ['spam', 'eggs', 100, 1234] >>> a[0] + >>> a = ['spam', 'eggs', 100, 1234] + >>> a[0] 'spam' >>> a[3] 1234 @@ -78,9 +80,11 @@ Python可以从这里下载:https://www.python.org/downloads/ - ``while`` 循环: :: - # Fibonacci series: + # Fibonacci series: + >>> a = 0 + >>> b = 1 >>> while b < 10: - ... print b + ... print (b) ... a, b = b, a+b ... 1 @@ -93,26 +97,27 @@ Python可以从这里下载:https://www.python.org/downloads/ - ``if`` 命令: 首先我们用 ``input()`` 从键盘读入一个整数: :: - >>>x = int(input("Please enter an integer here: ")) + >>> x = int(input("Please enter an integer here: ")) Please enter an integer here: 然后在输入的数字中使用 ``if`` 进行判断: :: - >>>if x < 0: - ... print ('the number is negative') - ...elif x == 0: - ... print ('the number is zero') - ...elif x == 1: - ... print ('the number is one') - ...else: - ... print ('More') + >>> if x < 0: + ... print ('the number is negative') + ... elif x == 0: + ... print ('the number is zero') + ... elif x == 1: + ... print ('the number is one') + ... else: + ... print ('More') ... - ``for`` 循环::: >>> # Measure some strings: - ... a = ['cat', 'window', 'defenestrate'] >>> for x in a: - ... print (x, len(x)) + >>> a = ['cat', 'window', 'defenestrate'] + >>> for x in a: + ... print (x, len(x)) ... cat 3 window 6 @@ -121,13 +126,13 @@ Python可以从这里下载:https://www.python.org/downloads/ - 定义函数: :: >>> def fib(n): # 生成n以内的菲波那切数列 - ... """Print a Fibonacci series up to n.""" + ... # """Print a Fibonacci series up to n.""" ... a, b = 0, 1 ... while b < n: ... print(b), ... a, b = b, a+b >>> # Now call the function we just defined: - ... fib(2000) + >>> fib(2000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 - 导入模块: :: diff --git a/chapter1/10_Start_working_with_processes_in_Python.rst b/chapter1/10_Start_working_with_processes_in_Python.rst index b2d049f..9bda347 100644 --- a/chapter1/10_Start_working_with_processes_in_Python.rst +++ b/chapter1/10_Start_working_with_processes_in_Python.rst @@ -24,7 +24,7 @@ print("Hello Python Parallel Cookbook!!") closeInput = raw_input("Press ENTER to exit") - print"Closing calledProcess" + print("Closing calledProcess") ``calling_Process`` 的代码如下: :: diff --git a/chapter3/09_How_to_manage_a_state_between_processes.rst b/chapter3/09_How_to_manage_a_state_between_processes.rst index d231c88..0e6df6c 100644 --- a/chapter3/09_How_to_manage_a_state_between_processes.rst +++ b/chapter3/09_How_to_manage_a_state_between_processes.rst @@ -6,7 +6,7 @@ Python的多进程模块提供了在所有的用户间管理共享信息的管 管理者有以下特性: - 它控制着管理共享对象的服务进程 -- 它确保当某一进程修改了共享对象之后,所有的进程拿到额共享对象都得到了更新 +- 它确保当某一进程修改了共享对象之后,所有的进程拿到的共享对象都得到了更新 |how| ----- diff --git a/chapter4/03_Event_loop_management_with_Asyncio.rst b/chapter4/03_Event_loop_management_with_Asyncio.rst index 00f76ba..cb5339c 100644 --- a/chapter4/03_Event_loop_management_with_Asyncio.rst +++ b/chapter4/03_Event_loop_management_with_Asyncio.rst @@ -67,7 +67,7 @@ Asyncio提供了一下方法来管理事件循环: loop.stop() def function_4(end_time, loop): - print ("function_5 called") + print ("function_4 called") if (loop.time() + 1.0) < end_time: loop.call_later(1, function_4, end_time, loop) else: pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy