多进程应用积木块区
- 多进程使用同一片内存单元,因此可以通过全局变量来共享交换数据。
- 每个进程都有独立的内存单元,进程间无法通过共享全局变量的方式来交换数据。我们通过队列来进行进程间的数据共享。
- 我们使用图形化积木来实现多进程编程。进程分为主进程和几个子进程。子进程函数内部的变量和外面主进程的变量不同(即使同名,所以不要同名以做区分)。
- 主进程默认会创建一个共享队列。
- 创建子进程时,会把主进程的共享队列传给子进程函数。因此创建的子进程函数需要携带一个变量来接收这个共享队列,然后对其进行读写。
- 使用多进程进行编程可以更加充分的利用树莓派cpu的运算能力。
- 有些积木执行起来比较阻塞耗时,如果在多线程中访问这样的积木,会导致所有线程都被阻塞运行,影响功能。此时
使用多进程编程就可以解决这样的问题。
1. 积木功能说明
- 功能简介:创建一个子进程。子进程函数需要携带一个变量,这个变量表示进程间通信的共享队列。。
- 参数说明:参数1为子进程的函数名。
- 返回值:无。
- 功能简介:本积木仅用于在子进程函数中,向共享队列写入数据。
- 参数说明:
- 参数1:为共享队列,即子进程函数的入参。
- 参数2:要写入队列的数据。
- 返回值:无。
- 功能简介:本积木仅用于在子进程函数中,从共享队列读取数据。
- 参数说明:
- 返回值:返回共享队列中的数据。如果共享队列中没有数据,则返回None。
- 功能简介:本积木仅用于在主进程函数中,从共享队列读取数据。
- 参数说明:无。
- 返回值:返回共享队列中的数据。如果共享队列中没有数据,则返回None。
- 功能简介:本积木仅用于在主进程函数中,向共享队列写入数据。
- 参数说明:
- 返回值:返回共享队列中的数据。如果共享队列中没有数据,则返回None。
2. 注意事项
- 子进程函数切记一定要携带一个变量,该变量即为进程间用于通信的共享队列。
- 进程间无法共享全局变量,因此进程内访问变量时,注意不过访问不属于本进程的变量,以免出现难以定位的问题。
3. 积木块应用案例
- 多进程编程适用于执行有些阻塞耗时的积木,将这样的积木放到单独的子进程函数中进行执行,然后将执行结果写入共享队列。
这样这些阻塞耗时的积木就不会影响其他程序的运行。
- 使用DHT11模块获取温湿度这个积木会阻塞耗时。
- 我们分别使用多进程和多线程,通过DHT11获取温度来看下区别。
(图1)使用多进程获取DHT11模块检测的温度
(图2)使用多线程获取DHT11模块检测的温度
- 图1的调试信息上打印的时间,刚好是每隔1s打印一次。即子进程中执行的阻塞代码没有影响到主进程。
- 图2的则是每次间隔都超过1s(程序写的是一秒打印一次),即
主线程的代码实际上被子线程里的读取DHT11温湿度的积木给阻塞,没有按照预期运行。