Как уменьшить задержку в службе systemd для потоков BLELinux

Ответить
Anonymous
 Как уменьшить задержку в службе systemd для потоков BLE

Сообщение Anonymous »

Есть ли способ, чтобы служба systemd работала так же быстро, как программа, запускаемая через терминал?
У меня есть программа на Python (fpp_ble_server.py), которая использует gatttool для управления некоторыми BLE горит, программа работает отлично, когда я запускаю ее в терминале. Однако когда я создал службу systemd для запуска при загрузке, программа работала очень медленно. Эта программа работает с легким секвенсором, поэтому время имеет решающее значение. Она запускается на Rasberry Pi 3 под управлением ОС Falcon Pi Player. Чтобы внести ясность: программа работает, когда я запускаю ее со службой, просто она работает очень медленно, поэтому при вызовах BLE возникает большая задержка.
Вот мой сервис файл:
[Unit]
Description=Custom Python Service for Falcon Pi Player sequence BLE calls.
After=multi-user.target
After=fpp_tty.service

[Service]
Type=simple
User=fpp
Group=fpp
StandardOutput=syslog
StandardError=syslog
ExecStart=/bin/python /home/fpp/BLE_Lights/fpp_ble_server.py
CPUSchedulingPolicy=fifo
CPUSchedulingPriority=95
IOSchedulingClass=realtime
IOSchedulingPriority=3

[Install]
WantedBy=multi-user.target

Похоже, служба работает правильно:
fpp@FPP:~/BLE_Lights $ systemctl status fpp_ble_server.service
● fpp_ble_server.service - Custom Python Service for Falcon Pi Player sequence BLE calls.
Loaded: loaded (/etc/systemd/system/fpp_ble_server.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2024-04-11 14:55:17 CDT; 10s ago
Main PID: 5564 (python)
Tasks: 9 (limit: 1933)
CPU: 374ms
CGroup: /system.slice/fpp_ble_server.service
├─5564 /bin/python /home/fpp/BLE_Lights/fpp_ble_server.py
├─5567 /usr/bin/gatttool -I
├─5568 /usr/bin/gatttool -I
├─5569 /usr/bin/gatttool -I
├─5571 /usr/bin/gatttool -I
├─5572 /usr/bin/gatttool -I
├─5573 /usr/bin/gatttool -I
├─5574 /usr/bin/gatttool -I
└─5575 /usr/bin/gatttool -I

Apr 11 14:55:17 FPP systemd[1]: Started Custom Python Service for Falcon Pi Player sequence BLE calls..
Apr 11 14:55:17 FPP sudo[5565]: fpp : TTY=pts/3 ; PWD=/ ; USER=root ; COMMAND=/usr/bin/chown fpp:fpp /home/fpp/B>
Apr 11 14:55:17 FPP sudo[5565]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=500)
Apr 11 14:55:17 FPP sudo[5565]: pam_unix(sudo:session): session closed for user roo

Операционная система: Raspbian GNU/Linux 11 (bullseye) Armv7l
Хост: Raspberry Pi 3 Model B Rev 1.2
Ядро: 6.1.21-v7+
Время работы: 1 час 45 минут
Пакеты: 1000 (dpkg)
Оболочка: bash 5.1.4
Терминал: /dev/pts/2
ЦП: BCM2835 (4) @ 1,200 ГГц
Память: 114 МБ / 870 МБ
Я пробовал добавить CPUScheduling, IOScheduling и Nice в служебный файл. Я также попробовал запустить программу как cronjob при загрузке. В любом случае программа работает значительно медленнее, чем если бы я запускал ее из окна терминала.
import serial
import threading
import csv
import pexpect

# Main function process for reading FPP sequence and sending comands to lights
def main():
# Initiate the lights
lights = [BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx"),
BLEDevice("xx:xx:xx:xx:xx:xx")]
# Connect to ech of the lights
[light.connect for light in lights]
print ("Running....")
# Monitor Serial Connection
with serial.Serial('/home/fpp/BLE_Lights/ttyclient', 115200) as ser:
#print (ser.name)
while True:
sync = ser.read()
if sync.hex() == '7e':
data = ser.read(len(lights)*3+2).hex(':').split(':')
t = []
Bs = 2 # Start bite
for i in range(8):
Be = Bs + 3
t.append(threading.Thread(target=lights.hex, args=(data[Bs:Be],)))
Bs = Be
for i in range(8):
t.start()
for i in range(8):
t.join()

GATT_DICT={}
with open("/home/fpp/BLE_Lights/gatt_key.csv", 'r') as data:
for line in csv.reader(data, delimiter=','):
#print (line)
GATT_DICT[line[0]] = line[1]

class BLEDevice(object):
def __init__(self, MAC, timeout=0.05, disconnect=10):
self.MAC = MAC
self.timeout = timeout
self.disconnect = disconnect
self._disconnected = 0
self._CMD = ''
self._HEX = []
self._color = ''
self._bright = 0.01

@property
def connect(self):
# Connect to the device.
print(f"Connecting to: {self.MAC}")
self._con = pexpect.spawn("gatttool -I", timeout = self.timeout)
self._con.delaybeforesend = None
self._con.sendline(f"connect {self.MAC}")

@property
def exit(self):
# Connect to the device.
print(f"Disconnecting: {self.MAC}")
self._con.sendline("exit")
self._con.close()
print(self._con.exitstatus, self._con.signalstatus)

@property
def reload(self):
# Disconnect to the device.
self.exit
self.connect

@property
def is_connected(self):
index = self._con.expect_exact([b'[LE]> \r\x1b[KNotification handle = 0x0012 value',
pexpect.TIMEOUT, pexpect.EOF, ])
if index == 0:
#print (f'{self.MAC} - Write successful')
self._con.timeout = 0.03
self._disconnected = 0
if index == 1:
self._disconnected += 1
#print (f'{self.MAC} - Connection refused: {self._disconnected}')
if self._disconnected >= self.disconnect:
print (f'{self.MAC} - Connection refused: {self._disconnected}')
self._disconnected = 0
self.reload

def write(self, CMD):
if CMD != self._CMD:
try:
self._con.sendline(f"char-write-cmd 0x0010 {GATT_DICT[CMD]}")
except KeyError:
print (f'WARNING: Missing key {CMD}')
with open('/home/fpp/BLE_Lights/gatt_key.log', 'a') as f:
f.write(f'{CMD}\n')
self.is_connected
self._CMD = CMD
#Sprint ('-----------------------------------------------------')

def hex(self,HEX):
#HEX = ['00','00','00'] # FOR TEXTING ONLY
if HEX != self._HEX:
HEX_max = int(max(HEX),16)
#print (HEX, HEX_max)
if HEX_max in [255, 0]:
bright = '1'
color = ''.join(HEX)
else:
bright = max(round(HEX_max/255.0,2),0.01)
#print (f'Bright: {bright}')
#print (HEX)
color = []
for n in HEX:
c = hex(round(min(255,int(n, 16)/bright)))[2:]
if len(c) != 2:
c = "0" + c
color.append(c)
color = ''.join(n.replace(max(color),'ff') for n in color)
bright = str(bright)
#print (self.MAC)
#print (f'HEX: {HEX}; Hex_Max: {HEX_max}; Color: {color}; Bright: {bright}')
#print (color, bright)
if self._bright != bright:
self.write(bright)
if self._disconnected == 0:
self._bright = bright

if self._color != color:
self.write(color)
if self._disconnected == 0:
self._color = color
if self._disconnected == 0:
self._HEX = HEX


Подробнее здесь: https://stackoverflow.com/questions/783 ... le-threads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»