python并行线程和进程之间的差异

jchrr9hc  于 2023-01-27  发布在  Python
关注(0)|答案(1)|浏览(111)

根据我目前的理解,进程是指令的集合,沿着它运行时使用的所有资源。这包括代码、输入/输出、资源、内存、文件句柄等等。换句话说,它包含了执行程序所需的一切。

# 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.为什么内存/数据经常被描述为在进程中比在线程中“更难共享”?线程究竟是如何共享数据的?

  1. CPU是否计算线程或进程?内核是否计算线程或进程?
    1.你能提供一般的指导方针和例子来说明什么时候使用某些东西吗?在python中有线程和进程的经验法则吗?
0ejtzxu1

0ejtzxu11#

要回答这个问题,你必须理解什么是python GIL。基本上Python的设计允许代码的任何部分访问内存。为了避免问题(比如同时对同一内存的多次调用......),有一个锁禁止同时执行两个任务。这就是为什么Python是纯过程的,一个接一个地执行任务。
在现代编程中,人们希望更好地使用多核处理器,从而并行化编程以提高性能。由于GIL,有两种解决方案:

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

总而言之,线程和进程允许你把一些任务和其他任务分开,给你一种改进基本过程程序的方法。在一些语言中,它们的工作方式没有太大的区别,但是在Python中,主要要记住的是:

  • 线程:保持共享内存,但不是真正的并行编程。如果你的代码需要等待时间,这是很有用的,这样你就可以在等待时间之间做其他事情。如果你使用100%的CPU,它会降低你的代码,因为执行任务之间经常变化,导致开销。
  • 进程(Processes):实现起来有点困难,因为你必须担心内存,而在Python中通常不会这样做。主要的好处是,如果你的代码可以并行化,你可以极大地提高性能。

相关问题