(请注意,整个问题虽然解决了并行编程问题,但主要是在python 3.X的上下文/应用程序框架下构建)
目前,我从阅读中得到的是:
进程,是一组说明,以及运行时随附的所有资源。它将包括以下代码,以及输入/输出/资源/内存/文件句柄/等。换句话说,它就是整个厨房的水槽。
# 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脚本过程类比,我选择哪一个,它们会是什么?产生另一个过程相当于在更改文件名时再次回忆整个事物?
# 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!')
我也有一个模糊的想法,即一个进程可以包含多个线程,它是否只相当于加载一堆更多"概念" for loops呢?
# 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')
两者如何真正地相互不同?在线搜索我认为流程更独立,更重量级,而线程更轻巧,更容易彼此共享内存。"但这究竟意味着什么呢?为什么cant进程也会彼此共享内存?如果线程可以共享内存"为什么我无法从同一个脚本中生成的不同线程访问不同的变量(例如from thread_a import var_data
)
最后,究竟是什么计算? CPU是否计算线程或进程?或者它是包含多个核心/等的总体术语。核心是计算进程还是线程?
要点:
1)使用一个简单的python脚本作为进程的示例,产生另一个进程/线程的等价物是什么? (例如,重复脚本/脚本的子集/仅部分代码)
2)流程如何与线程根本不同,什么是流程能够做线程不能做的事情?
3)为什么记忆/数据经常被描述为"更难分享"在进程中比线程?以及线程如何共享数据?
4)CPU的计算线程或进程。核心计算线程或进程
5)什么是何时使用
的一般指导原则/示例答案 0 :(得分:1)
要开始回答这个问题,您必须了解python GIL是什么。基本上Python旨在让代码的任何部分访问内存。为了避免问题(例如同时多次调用同一个内存......),有一个锁定禁止同时执行2个任务。 所以这就是为什么python是纯粹的程序性的,一个接一个地执行任务。
在现代编程中,有一种意愿可以更好地使用多核处理器,从而并行化编程以提高性能。由于GIL,有2种解决方法:
Threading
是一个允许在不同线程中“同时”生成多个任务的模块。问题在于它并非真正在同一时间,而是将被切割成原子任务,并在不同任务之间切换。但是你永远不会同时拥有2个任务,所以你仍然可以像往常一样分享记忆,这就是为什么它很简单。
multiprocessing
允许您生成实际进程,这些进程将同时工作。但价格是你不能安全地在这些过程之间共享内存(以经典的方式)。拥有多个线程的多个进程没有问题。
但你并不是完全孤单的。通过使用Lock
,有几种方法可以在进程之间安全地进行通信。您可以在此here上看到更多信息。
总而言之,Threads和Process允许您为其他人分离一些任务,为您提供改进基本程序程序的方法。在某些语言中,它们的工作方式没有太大区别,但在Python中要记住的主要内容是:
线程:保留共享内存,但不是真正的并行编程。如果你的代码是等待时间,这很有用,所以你可以在其间做其他事情。如果您使用100%CPU,则会降低代码速度,因为执行会在任务之间经常发生变化并导致开销。
进程:实现起来有点困难,因为你不得不担心内存,而Python通常不会这样做。如果您的代码可以并行化,那么主要的好处是可以大大提高您的性能。