首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中非常简单的并发编程

Python中非常简单的并发编程
EN

Stack Overflow用户
提问于 2012-05-07 00:29:04
回答 2查看 11.1K关注 0票数 10

我有一个简单的Python脚本,它使用两个更复杂的Python脚本,并对结果做一些事情。

我有两个模块,Foo和Bar,我的代码如下所示:

代码语言:javascript
运行
复制
import Foo
import Bar

output = []

a = Foo.get_something()
b = Bar.get_something_else()

output.append(a)
output.append(b)

这两种方法都需要很长时间才能运行,两者都不依赖于另一种方法,因此显而易见的解决方案是并行运行它们。我如何做到这一点,但确保订单是维持的:,无论哪一个先完成,都必须等待另一个完成,然后脚本才能继续

如果我还没有说清楚的话,请告诉我,我已经尝试使示例代码尽可能简单。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 19:08:16

代码语言:javascript
运行
复制
import multiprocessing

import Foo
import Bar

results = {}

def get_a():
    results['a'] = Foo.get_something()



def get_b():
    results['b'] = Bar.get_something_else()

process_a = multiprocessing.Process(target=get_a)
process_b = multiprocessing.Process(target=get_b)


process_b.start()
process_a.start()


process_a.join
process_b.join

这是您的程序的流程版本。

注意:在线程处理中,存在共享的数据结构,因此您必须担心锁定,这将避免对数据的错误操作,此外,正如上面提到的琥珀一样,它还存在一个GIL (Global解释器Lock)问题,而且由于您的两个任务都是CPU密集型的,这意味着由于调用通知线程获取和释放线程,这将花费更多的时间。然而,如果您的任务是I/O密集型的,那么它不会产生太大的影响。

现在,由于进程中没有共享的数据结构,因此不必担心锁,而且不管GIL如何工作,所以您实际上可以享受多处理器的真正功能。

请记住:进程与线程相同,而不需要使用共享数据结构(所有工作都是隔离的,并且都集中在消息传递上)。

看看dabeaz.com,他曾经很好地介绍了并发编程。

票数 10
EN

Stack Overflow用户

发布于 2012-05-07 00:30:25

通常,您会使用threading来完成这个任务。

首先,为要并行运行的每件事创建一个线程:

代码语言:javascript
运行
复制
import threading

import Foo
import Bar

results = {}

def get_a():
    results['a'] = Foo.get_something()
a_thread = threading.Thread(target=get_a)
a_thread.start()

def get_b():
    results['b'] = Bar.get_something_else()
b_thread = threading.Thread(target=get_b)
b_thread.start()

然后,要要求两者都完成,请在这两种情况下使用.join()

代码语言:javascript
运行
复制
a_thread.join()
b_thread.join()

此时,您的结果将以results['a']results['b']格式显示,因此,如果您想要一个有序列表:

代码语言:javascript
运行
复制
output = [results['a'], results['b']]

注意:如果这两个任务本质上都是CPU密集型的,您可能需要考虑multiprocessing --因为Python,给定的multiprocessing进程将只使用一个CPU核心,而multiprocessing则可以将这些任务分发到不同的核心。但是,它的开销比threading稍高,因此,如果任务占用的CPU较少,那么它的效率可能就不高。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10475448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档