根据我目前的理解,进程是指令的集合,沿着它运行时使用的所有资源。这包括代码、输入/输出、资源、内存、文件句柄等等。换句话说,它包含了执行程序所需的一切。
# 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循环?
# 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 import var_data)?
最后,什么计算什么?CPU计算线程或进程吗?或者它是一个更广泛的术语,包括多个核心等?核心计算进程或线程吗?
摘要:
1.使用一个简单的python脚本作为一个进程的例子,产生另一个进程/线程的等价物是什么?(例如,复制脚本/脚本的子集/仅代码的某个部分)
1.进程与线程有何本质区别?有哪一个例子说明进程能够做线程做不到的事情?
1.为什么内存/数据经常被描述为在进程中比在线程中“更难共享”?线程究竟是如何共享数据的?
- CPU是否计算线程或进程?内核是否计算线程或进程?
1.你能提供一般的指导方针和例子来说明什么时候使用某些东西吗?在python中有线程和进程的经验法则吗?
1条答案
按热度按时间0ejtzxu11#
要回答这个问题,你必须理解什么是python GIL。基本上Python的设计允许代码的任何部分访问内存。为了避免问题(比如同时对同一内存的多次调用......),有一个锁禁止同时执行两个任务。这就是为什么Python是纯过程的,一个接一个地执行任务。
在现代编程中,人们希望更好地使用多核处理器,从而并行化编程以提高性能。由于GIL,有两种解决方案:
Threading
是一个允许在不同线程中“同时”产生多个任务的模块。问题是它不是真的同时产生,而是将被切割成原子任务,并在不同的任务之间切换。但是你永远不会同时有两个任务,所以你仍然可以像往常一样共享内存,这就是为什么它很简单。multiprocessing
允许您生成真实的的进程,这些进程将同时工作,但代价是您不能安全地在这些进程之间共享内存(以传统的方式)。拥有多个进程和多个线程是没有问题的。但是你并不是完全孤立的。有几种方法可以在进程之间安全地通信,例如使用Lock
。你可以在这里看到更多。总而言之,线程和进程允许你把一些任务和其他任务分开,给你一种改进基本过程程序的方法。在一些语言中,它们的工作方式没有太大的区别,但是在Python中,主要要记住的是: