首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >澄清并行线程/进程之间的差异

澄清并行线程/进程之间的差异
EN

Stack Overflow用户
提问于 2016-02-15 01:09:32
回答 1查看 311关注 0票数 1

(请注意,这个问题虽然涉及并行编程,但主要是在python3.x的上下文/应用程序下构建的)

目前,我从阅读中得到的是:

进程是一组指令,以及它运行时伴随的所有资源。它将包括以下代码,以及输入/输出/资源/内存/文件句柄/等等。换句话说,它是整个厨房水槽。

代码语言:javascript
复制
# this script, while running as a whole, is considered a process

print('hello world')

with open('something.txt', 'a') as file_handle:
    for i in range(500):
        file_handle.write('blablabla')
print('job done!')

但是,如果我想在相同的时间内做更多的事情--为了最大化我的计算机的处理能力--我可以选择产生更多的进程或线程。与上面简单的python脚本流程类比相比,我应该选择哪一个呢?生成另一个进程是否相当于在更改文件名的同时再次回忆整个事件?

代码语言:javascript
复制
# changed filename (is this "another process?")

print('hello world')

with open('something_else.txt', 'a') as file_handle:
    for i in range(500):
        file_handle.write('blablabla')
print('job done!') 

我也有一个模糊的想法,即单个进程可以包含多个线程,这是否相当于加载一堆更“概念性”的循环呢?

代码语言:javascript
复制
# like would this be a "thread" a barebones "subset" of an entire program?

with open('something.txt', 'a') as file_handle:
    for i in range(500):
        file_handle.write('blablabla')

这两个人到底有什么区别呢?在网上搜索时,我发现进程更加独立和重量级,而线程更轻量级,“更容易彼此共享内存”。但这到底意味着什么呢?为什么进程不能彼此共享内存呢?如果线程可以“共享内存”,我为什么不能访问来自同一脚本(例如from thread_a import var_data)产生的不同线程的不同变量。

最后,究竟是什么在计算?CPU是否计算线程或进程?还是一个包含多个核心/等等的总括性术语?核心计算进程或线程吗?

摘要:

1)使用一个简单的python脚本作为一个进程的示例,与生成另一个进程/线程的等价性是什么?(例如,重复脚本/脚本子集/部分代码)

2)进程与线程有什么根本区别,进程能够做线程不能做的事情的例子是什么?

3)为什么在进程中内存/数据常常被描述为“更难共享”而不是线程?线程是如何共享数据的呢?

4)执行CPU的计算线程或进程。核心是否计算线程或进程?

( 5)什么时候使用什么的一般准则/例子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-15 14:48:45

要开始回答这个问题,您必须了解什么是python GIL。基本上,Python的设计是让代码的任何部分访问内存。为了避免问题(例如同时对同一内存进行多次调用.),有一个Lock禁止同时执行2个任务。这就是为什么python纯粹是一个过程,一个接着一个地执行任务。

在现代编程中,人们希望更好地使用多核处理器,从而将程序并行化以提高性能。由于GIL的存在,有两个解决办法:

  • Threading是一个允许在不同线程中“同时”生成多个任务的模块。问题是,它实际上不是同时进行的,而是会被切割成原子任务,并在不同的任务之间切换。但是你永远不会同时拥有两个任务,所以你仍然可以像往常一样共享内存,这就是为什么它很简单的原因。
  • 另一方面,multiprocessing允许您生成真正的进程,这些进程将同时工作。但是代价是,您不能在这些进程之间安全地共享内存(以经典的方式)。在其中包含多个线程的多个进程没有问题。不过,你并不是一个人。有几种方法可以安全地在进程之间进行通信,例如使用Lock。您可以在这个这里上看到更多信息。

总之,线程和进程允许您为其他任务分离一些任务,从而为您改进基本的过程程序提供了一种方法。在某些语言中,它们的工作方式并没有太大的区别,但是在Python中,主要要记住的是:

  • 线程:保持共享内存,但不是真正的并行编程。如果您的代码是等待时间,那么这是非常有用的,这样您就可以在中间做其他事情了。如果您使用的是100%的CPU,它会减慢您的代码,因为执行会在任务之间经常发生变化,并造成开销。
  • 进程:实现起来有点困难,因为您必须担心内存问题,而这在Python中通常是不需要的。主要的好处是,如果代码可以并行化,则可以显着地提高性能。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35400059

复制
相关文章

相似问题

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