根据我目前的理解,进程是指令的集合以及它在运行时使用的所有资源。这包括代码、输入/输出、资源、内存、文件句柄等。换句话说,它包含执行程序所需的一切。
# 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!')
我也有一个模糊的想法,即单个进程可以包含多个线程,那么它是否相当于加载一堆更"概念"的循环?
# 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')
进程和线程之间的主要区别是什么?在线资源表明,进程更加自主和资源密集,而线程更轻量级,能够相互共享内存。但这在实践中意味着什么?为什么进程不能共享内存?如果线程能够共享内存,为什么我无法访问从同一脚本生成的不同线程的变量(例如,从thread_a导入var_data(?
最后,究竟是什么计算了什么?CPU 是计算线程或进程,还是包含多个内核等的更广泛术语?内核是计算进程还是线程?
<小时 />总结:
使用一个简单的 python 脚本作为进程的示例,相当于生成另一个进程/线程是什么?(例如,重复脚本/脚本的子集/仅某些代码部分(
进程与线程有何根本不同,进程能够执行线程无法执行的操作的示例是什么?
为什么内存/数据在进程中经常被描述为比线程"更难共享"?线程如何共享数据?
CPU 是否计算线程或进程。内核是否计算线程或进程?
您能否提供何时使用某些东西的一般指南和示例?python中的线程与进程是否有经验法则?
要开始回答这个问题,你必须了解什么是python GIL。基本上,Python旨在让代码的任何部分访问内存。为了避免出现问题(例如同时多次调用同一内存...(,有一个 Lock 禁止同时执行 2 个任务。所以这就是为什么python是纯粹的程序化,一个接一个地执行任务。
在现代编程中,人们愿意更好地使用多核处理器,从而并行编程以提高性能。由于 GIL,有 2 种解决方法:
-
Threading
是一个模块,允许在不同的线程中"同时"生成多个任务。问题是它不是真的同时,而是会被切成原子任务,并在不同的任务之间切换。但是您永远不会同时拥有 2 个任务,因此您仍然可以像往常一样共享内存,这就是它简单的原因。 -
另一方面,
multiprocessing
允许您生成将同时工作的真实进程。但代价是您无法安全地在这些进程之间共享内存(以经典方式(。拥有多个进程和多个线程没有问题。不过,你并不完全孤单。有几种方法可以在进程之间安全地进行通信,例如使用Lock
。您可以在此处查看更多信息。
总而言之,线程和进程允许您将一些任务分开给其他任务,从而为您提供一种改进基本过程程序的方法。在某些语言中,它们的工作方式没有太大区别,但在 Python 中要记住的主要事情是:
-
线程:保留共享内存,但不是真正的并行编程。如果您的代码作为等待时间,这很有用,因此您可以在两者之间执行其他操作。如果您使用的是 100% CPU,则会减慢您的代码速度,因为执行将在任务之间经常变化并导致开销。
-
进程 :实现起来有点困难,因为您必须担心内存,而您在 Python 中通常不会。主要的好处是,如果您的代码可以并行化,则可以显着提高性能。