澄清并行之间的差异threads/processes
Clarification of differences between parallel threads/processes
(请注意,这整个问题虽然解决了并行编程问题,但主要是在 python 3.X 的 context/applications 下构建的)
目前,我从阅读中收集到的是:
a process,是一组指令,以及它在 运行 时附带的所有资源。它将包括以下代码,以及 input/output/resource/memory/filehandle/etc。换句话说,就是整个厨房水槽。
# 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!')
我也有一个模糊的想法,即单个进程可以包含多个线程,那么它是否相当于加载更多 "conceptual" for 循环?
# 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')
两者究竟有何不同?网上查了下觉得进程比较独立重量级,线程比较轻量级"easier to share memory with each other." 但是这到底是什么意思呢?为什么进程也不能彼此共享内存?如果线程可以 "share memory" 为什么我不能从同一脚本生成的不同线程访问不同的变量(例如像 from thread_a import var_data
)
最后,究竟是什么在计算什么? CPU 计算线程还是进程?或者它是一个包含多个 cores/etc 的总体术语。内核计算进程还是线程?
总结:
1) 使用一个简单的 python 脚本作为进程的示例,生成另一个 process/thread 的等价物是什么? (例如,仅复制 script/some 代码部分的 script/subset)
2) 进程与线程有何根本区别,进程能够执行线程不能执行的操作的示例是什么?
3) 为什么 memory/data 在进程中经常被描述为 "harder to share" 而不是在线程中?以及线程如何共享数据?
4) 执行CPU的计算线程或进程。核心计算线程还是进程
5) 什么时候使用什么
有哪些通用的guidelines/examples
要开始回答这个问题,您必须了解什么是 python GIL。基本上 Python 旨在让代码的任何部分访问内存。为了避免出现问题(例如同时多次调用同一内存......),有一个 Lock 禁止同时执行 2 个任务。
所以这就是为什么 python 是纯程序性的,一个接一个地执行任务。
在现代编程中,人们希望更好地使用多核处理器,从而并行化编程以提高性能。由于 GIL,有 2 个解决方法:
Threading
是一个允许在不同线程中生成多个任务 "at the same time" 的模块。美中不足的是,它并不是真正的同时,而是会被切割成原子任务,并在不同的任务之间切换。但是你永远不会同时有 2 个任务,所以你仍然可以像往常一样共享内存,这就是为什么它很简单。
另一方面,multiprocessing
允许您生成实际进程,这些进程将同时工作。但是代价是您不能安全地在这些进程之间共享内存(以经典方式)。多个进程里面有多个线程是没有问题的。
不过,您并不完全孤单。有几种方法可以在进程之间安全地通信,例如使用 Lock
。你可以在这个here.
上看到更多
总而言之,线程和进程允许您为其他任务分离一些任务,为您提供一种改进基本过程程序的方法。在某些语言中,它们的工作方式没有太大区别,但在 Python 中,要记住的主要事情是:
线程:保持共享内存,但不是真正的并行编程。如果您的代码作为等待时间,这将很有用,因此您可以在两者之间做其他事情。如果您使用 100% CPU,它会减慢您的代码,因为执行会在任务之间经常变化并导致开销。
进程:实施起来有点困难,因为您必须担心内存问题,这在 Python 中通常不会。主要的好处是如果您的代码可以并行化,您可以显着提高性能。
(请注意,这整个问题虽然解决了并行编程问题,但主要是在 python 3.X 的 context/applications 下构建的)
目前,我从阅读中收集到的是:
a process,是一组指令,以及它在 运行 时附带的所有资源。它将包括以下代码,以及 input/output/resource/memory/filehandle/etc。换句话说,就是整个厨房水槽。
# 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!')
我也有一个模糊的想法,即单个进程可以包含多个线程,那么它是否相当于加载更多 "conceptual" for 循环?
# 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')
两者究竟有何不同?网上查了下觉得进程比较独立重量级,线程比较轻量级"easier to share memory with each other." 但是这到底是什么意思呢?为什么进程也不能彼此共享内存?如果线程可以 "share memory" 为什么我不能从同一脚本生成的不同线程访问不同的变量(例如像 from thread_a import var_data
)
最后,究竟是什么在计算什么? CPU 计算线程还是进程?或者它是一个包含多个 cores/etc 的总体术语。内核计算进程还是线程?
总结:
1) 使用一个简单的 python 脚本作为进程的示例,生成另一个 process/thread 的等价物是什么? (例如,仅复制 script/some 代码部分的 script/subset)
2) 进程与线程有何根本区别,进程能够执行线程不能执行的操作的示例是什么?
3) 为什么 memory/data 在进程中经常被描述为 "harder to share" 而不是在线程中?以及线程如何共享数据?
4) 执行CPU的计算线程或进程。核心计算线程还是进程
5) 什么时候使用什么
有哪些通用的guidelines/examples要开始回答这个问题,您必须了解什么是 python GIL。基本上 Python 旨在让代码的任何部分访问内存。为了避免出现问题(例如同时多次调用同一内存......),有一个 Lock 禁止同时执行 2 个任务。 所以这就是为什么 python 是纯程序性的,一个接一个地执行任务。
在现代编程中,人们希望更好地使用多核处理器,从而并行化编程以提高性能。由于 GIL,有 2 个解决方法:
Threading
是一个允许在不同线程中生成多个任务 "at the same time" 的模块。美中不足的是,它并不是真正的同时,而是会被切割成原子任务,并在不同的任务之间切换。但是你永远不会同时有 2 个任务,所以你仍然可以像往常一样共享内存,这就是为什么它很简单。
另一方面,multiprocessing
允许您生成实际进程,这些进程将同时工作。但是代价是您不能安全地在这些进程之间共享内存(以经典方式)。多个进程里面有多个线程是没有问题的。 不过,您并不完全孤单。有几种方法可以在进程之间安全地通信,例如使用Lock
。你可以在这个here. 上看到更多
总而言之,线程和进程允许您为其他任务分离一些任务,为您提供一种改进基本过程程序的方法。在某些语言中,它们的工作方式没有太大区别,但在 Python 中,要记住的主要事情是:
线程:保持共享内存,但不是真正的并行编程。如果您的代码作为等待时间,这将很有用,因此您可以在两者之间做其他事情。如果您使用 100% CPU,它会减慢您的代码,因为执行会在任务之间经常变化并导致开销。
进程:实施起来有点困难,因为您必须担心内存问题,这在 Python 中通常不会。主要的好处是如果您的代码可以并行化,您可以显着提高性能。