我应该使用哪个线程或进程?

时间:2016-12-29 18:57:31

标签: python multithreading python-2.7 raspberry-pi multiprocessing

我正在使用覆盆子pi在python中编写代码

while(true):
  functionA
  functionB

功能A基本上是一个以png格式捕获图像的命令。我不希望它是一个阻塞功能。我希望我的代码继续执行功能B,而同时功能A捕获图像并使数据为下次运行做好准备。

我对是否使用线程或进程感到困惑。

如果我必须使用线程,什么时候会停止? 在功能A完成它的执行后它会停止一次吗?在这种情况下,每次我必须启动此线程时,我需要调用start方法? 或者我应该使用一个流程,我将如何处理它意味着流程什么时候停止。

2 个答案:

答案 0 :(得分:2)

让我们清楚一下线程和进程之间的区别。非正式定义:线程是作为进程的一部分执行的一系列代码;进程可能包含许多线程,这些线程共享相同的进程空间和虚拟内存空间。线程将在完成时结束(并终止自身),而不必结束父进程。从它的声音来看,你应该使用一个线程来同步执行functionA。一个新的过程肯定会占用更多的资源和声音。此外,如果您需要在线程完全执行完毕后再次执行该代码,则需要再次创建线程。另一方面,如果该方法看起来适合您正在执行的任务,则可以以无限循环的方式编写在新线程中执行的代码。

答案 1 :(得分:2)

CaitLAN的回答遗漏了几个重要的细节:

1)进程之间的通信比线程之间的通信更难 。线程都存在于同一个地址空间中,因此它们之间的通信几乎与线程A写入变量一样简单,线程B读取它。

进程通过共享管道,共享文件,网络连接或操作系统提供的其他方式相互通信。如果你想在进程之间传递对象,它取决于你(或者你使用的某个框架),以便为编组"提供方法。和"解组" (a.k.a。,"序列化","酸洗",......)对象。

  

*那里潜藏着一个魔鬼,几乎是#34;而且比我想在这里描述的要复杂得多。 Google"线程同步"和/或"记忆可见性"。

2)你可以安全地杀死进程。你永远不能确定杀死一个线程。如果你的功能A有可能脱离深层,那么如果它在程序中的一个线程中运行,它可能会取消你的整个程序,但你的程序可能会恢复*如果functionA正在作为一个单独的Python进程运行。

  

*再次,在这个空间里写的太多了。