在使用Multiprocessing时,由于Adafruit库的一个限制,会导致出现一些问题。具体来说,如果您的代码中需要使用多进程以便任意并行任务时,Adafruit可能会阻塞这些任务,这会导致程序在运行时出现问题。
为解决这个问题,可以通过重写Adafruit库中的某些函数的方式来绕过这个限制。以下是一种可能的解决方案:
from multiprocessing import Process
from Adafruit_Python_SSD1306 import SSD1306_128_64
class SSD1306_128_64_processable(SSD1306_128_64):
def __init__(self, *args, **kwargs):
super(SSD1306_128_64_processable, self).__init__(*args, **kwargs)
def processable_command(func):
def inner(self, *args, **kwargs):
self._queue.put(('command', func, args, kwargs))
return self._queue.get()
return inner
def processable_data(func):
def inner(self, *args, **kwargs):
self._queue.put(('data', func, args, kwargs))
return inner
setattr(SSD1306_128_64_processable, '_processable_command', processable_command)
setattr(SSD1306_128_64_processable, '_processable_data', processable_data)
def run_ssd1306_128_64(ipaddr, queue, **kwargs):
"""
:param server: Flask server instance
"""
oled = SSD1306_128_64_processable(**kwargs)
oled._processable_command = processable_command
oled._processable_data = processable_data
while True:
try:
command, func, args, kwargs = queue.get()
if command == 'command':
func(oled, *args, **kwargs)
else:
func(oled, *args, **kwargs)
except Exception as ex:
# todo: log the exception
print(ex)
def some_function(item):
# do the complex calculation
return item
if __name