installation de libzmq
Contexte
En 2019, @marrucho a rencontré un problème de blocage des événements au bout de quelques minutes, dans un programme qui souscrit des événements sur des Device Proxy différents.
1. Comment reproduire le problème ?
Démarrer ce script python côté subscriber (2 Device Proxy avec 2 Callback appelées avec la méthode push_event(), 2 souscriptions d'event) :
import PyTango,time
mybool=1
devtangotestdoublew='sys/tg_test/1'
dptangotestdoublew=PyTango.DeviceProxy(devtangotestdoublew)
devtangotestshort='sys/tg_test/jcm'
dptangotestshort=PyTango.DeviceProxy(devtangotestshort)
class CBTANGOTESTDOUBLEW():
def push_event(self,event):
print (" tangotest1: ",event.attr_value.value)
time.sleep(0.1)
class CBTANGOTESTSHORT():
def push_event(self,event):
print ("tangotestjcm: ",event.attr_value.value)
time.sleep(0.1)
cbtangotestdoublew=CBTANGOTESTDOUBLEW()
evttangotestodublew=dptangotestdoublew.subscribe_event('double_scalar_w',PyTango
.EventType.CHANGE_EVENT,cbtangotestdoublew)
cbtangotestshort=CBTANGOTESTSHORT()
evttangotestshort=dptangotestshort.subscribe_event('short_scalar_w',PyTango.Even
tType.CHANGE_EVENT,cbtangotestshort)
while mybool==1:
time.sleep(0.1)
Démarrer ce script python côté publisher (change les valeurs des 2 attributs):
[...] [À COMPLÉTER ?]
dev='sys/tg_test/1'
dp=PyTango.DeviceProxy(dev)
devjcm='sys/tg_test/jcm'
dpjcm=PyTango.DeviceProxy(devjcm)
for i in range (0,1000000)::
for j in range (1,10):
dp.double_scalar_w=j
dpjcm.short_scalar_w=j
time.sleep(0.5)
[...] [À COMPLÉTER ?]
2. Remontée du problème
Sur le forum TANGO
Le problème vient d'un bogue connu dans certaines versions de libzmq.
3. Versions concernées
Sous Debian 9, dans Tango 9.2, libtango9 installe la version de libzmq 4.2.1, qui dysfonctionne avec cpptango 9.2.5 installé.
Dans ce système (avec cette version de cpptango), il ne faut pas utiliser les versions de libzmq 4.2.0 et 4.2.1
Le problème est résolu dans Debian 10, qui intègre libzmq 9.3.1.
4. Comment corriger le bug ?
2 solutions existent:
-
mettre à jour Tango en version 9.3 : si on n'utilise pas Tango 9.3.0, ça ne fonctionne plus quand le nombre d'event atteint 1000 dans un client qui a souscrit des events sur plusieurs serveurs.
Il faut installer et compiler cppTango 9.3.3 ET une version de libzmq telle que libzmq < 4.2.0 OU libzmq >= 4.2.2
-
changer la version de libzmq, en installant une version >= 4.3.1 :
git clone -b v4.3.1 https://github.com/zeromq/libzmq.git sudo apt install libtool # nécessaire pour autogen sudo apt install autoconf # nécessaire pour autogen ./autogen.sh ./configure make sudo make install
Les .so du paquet libzmq5 dans 'stretch' pour l'architecture 'amd64' se trouvent par défaut dans
/usr/lib/x86_64-linux-gnu
. Lemake install
génère les .so dans/usr/local/lib
C'est cette version qui a été mise en place sur ThomX (serveur ? client ?).
Pour exécuter un programme C++ ou Python en utilisant cette version, il faut configurer dans un shell une variable d'environnement :
# bibliothèques partagées (libzmq) ## pour les serveurs export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ## pour les clients, qui ont accès à `/data/shared` export LD_LIBRARY_PATH=/data/shared/lib:$LD_LIBRARY_PATH