Многопоточный опрос уровней абонентов станций GPON OLT

На выходе скрипт обновляет таблицу в MySQL, уровнем сигнала:

#!/usr/local/bin/python
# coding=utf-8

import mysql.connector
from mysql.connector import Error
import config    
import func
import socket
import re
from tendo import singleton
from pysnmp.hlapi import *
import threading
import time 


vr="1.0"
info="Сей дивный скрипт лезет snmp запросом на свичи olt/pon и опрашивает уровни"
copyleft="(с) 2018 by Pavel Gribov, http://грибовы.рф";
#выводим имя ПК и версию скрипта                
hostname = socket.gethostname()
print "Server: ",hostname
print "Version: ",vr
print "info: ",info
print "Copyright: ",copyleft

workcount=50; #количество потоков для опроса


def GetArrayLevels(ip,comm,oid):
 res=None
 errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData(comm),
           UdpTransportTarget(
               (ip, 161), timeout=2.0, retries=0
           ),
           ContextData(),
           ObjectType(ObjectIdentity(oid)))
 )  	     
 if errorIndication:
    print("Ошибка:",ip,comm,oid,errorIndication)
    return res
 elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
    return res			
 else:
    for varBind in varBinds:     
     if varBind[1]<0: res=varBind[1]
 return res

def worker(ip,community,ind,idr): 
    rz=GetArrayLevels(ip,community,".1.3.6.1.4.1.3320.101.10.5.1.5."+str(ind))
    try:
        conn2 = mysql.connector.connect(host=config.noc_host,database=config.noc_base,user=config.noc_user,password=config.noc_pass)
        #if conn2.is_connected(): func.putlog('--cоединение с БД '+config.noc_base+' установлено')
    except Error as e:
        print("Ошибка: ",e);
        exit(0);    
    finally:
        if rz!=None: 
                print ("Level:",rz);
                sql="update oltlevels set level=%s,lastmod=now() where id=%s";
                print ("update oltlevels set level="+str(rz)+" where id="+str(idr))
                ccr = conn2.cursor(dictionary=True,buffered=True)
                ccr.execute(sql,[str(rz),idr]);  
                conn2.commit();
    conn2=None
func.putlog("-скрипт стартовал");
func.putlog("--проверяю, а не запущены ли мы уже?");
try:
 me = singleton.SingleInstance() 
except:
    func.putlog("--мы уже запущены!");    
    exit(1)
func.putlog("--Ок. Одна копия, работаем дальше");    
func.putlog("--соединяемся с noc");
try:
    conn = mysql.connector.connect(host=config.noc_host,database=config.noc_base,user=config.noc_user,password=config.noc_pass)
    if conn.is_connected(): func.putlog('--cоединение с БД '+config.noc_base+' установлено')
except Error as e:
    print("Ошибка: ",e);
    exit(0);    
finally:
    func.putlog("---делаем выборку устройств для опроса");
    sql="select * from oltlevels order by rand()";
    cursor = conn.cursor(dictionary=True,buffered=True)
    cursor.execute(sql);
    row = cursor.fetchone()	    
    while row is not None:      
        ip=row["ip"]
        community=row["community"]
        idr=row["id"]
        ind=row["ind"]
        func.putlog("----опрашиваем "+str(ip)+" ind="+str(ind)+",id="+str(idr));                
        thread = threading.Thread(target=worker, args=(ip,community,ind,idr,)).start()	
        while threading.active_count() >workcount:
         time.sleep(1)

        row = cursor.fetchone()	 
        
    while threading.active_count() >workcount:
         time.sleep(1)    
    func.putlog("---закончили");

AttributeError: ‘module’ object has no attribute ‘SingleInstance’

Всегда ранее проверял запуск «один ли экземпляр скрипта запущен» на python вот так:

    import tendo
    try:
     me = tendo.SingleInstance() 
    except:
	exit(1)
    func.putlog("--Ок. Одна копия, работаем дальше");

Однако после обновления ОС, стало выдавать ошибку вида:

Traceback (most recent call last):
  File "./olt_levels_get.py", line 27, in <module>
    me = tnd.SingleInstance() 
AttributeError: 'module' object has no attribute 'SingleInstance'

Исправляется так:

from tendo import singleton

try:
 me = singleton.SingleInstance() 
except:
    func.putlog("--мы уже запущены!");    
    exit(1)
func.putlog("--Ок. Одна копия, работаем дальше");

Ошибка во время установки пакетов FreeBSD 11.2

Ошибка:

pkg: warning: database version 34 is newer than libpkg(3) version 31, but still compatible
pkg: sqlite error while executing INSERT OR ROLLBACK INTO pkg_search(id, name, origin) VALUES (?1, ?2 || '-' || ?3, ?4); in file pkgdb.c:1542: no such table: pkg_search

Решение:

pkg shell 
CREATE VIRTUAL TABLE pkg_search USING fts4(id, name, origin); 
pragma user_version=33;

Количество дней от первого поступления товара. 1С Розница 2.2

Например можно так:

РазностьДат=9999999;
 	Запрос = Новый Запрос;
	 Запрос.Текст = 			
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	РАЗНОСТЬДАТ(ПоступлениеТоваровТовары.Ссылка.Дата, &ТекущаяДата, ДЕНЬ) КАК РазностьДат
		|ИЗ
		|	Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
		|ГДЕ
		|	ПоступлениеТоваровТовары.Ссылка.Проведен = ИСТИНА
		|	И ПоступлениеТоваровТовары.Номенклатура = &Номенклатура
		|
		|УПОРЯДОЧИТЬ ПО
		|	РазностьДат";	
		Запрос.УстановитьПараметр("Номенклатура", ном);
		Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
		Результат = Запрос.Выполнить().Выбрать();
		пока  Результат.Следующий() цикл
			РазностьДат=Результат.РазностьДат;
		конеццикла;

Жизнь замечательных грибов