Есть ли способ, чтобы служба 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
Как уменьшить задержку в службе systemd для потоков BLE ⇐ Linux
-
Anonymous
1712872469
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[i].hex, args=(data[Bs:Be],)))
Bs = Be
for i in range(8):
t[i].start()
for i in range(8):
t[i].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
Подробнее здесь: [url]https://stackoverflow.com/questions/78312891/how-to-decrease-latancy-in-a-systemd-service-for-ble-threads[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия