import pymysql
from pymysql . cursors import DictCursor
from multiprocessing import cpu_count
from update . models import Cinema , CinemaUser
import queue
import threading
from django . utils import timezone
import datetime
class GetVersion ( object ) :
def __init__ ( self , cinema_ip_list = None ) :
self . cinema_ip_list = cinema_ip_list
self . queue = queue . Queue ( ) # 注册队列
self . th_num = 0 # 获取CPU核心数量,-1后座位处理逻辑的线程数量
def get_all_cinema ( self ) :
print ( ' get_all_cinema ' )
if self . cinema_ip_list is None :
all_cinema_obj = Cinema . objects . all ( )
else :
all_cinema_obj = Cinema . objects . filter ( ip__in = self . cinema_ip_list )
for cinema_obj in all_cinema_obj :
print ( cinema_obj )
data = {
' ip ' : cinema_obj . ip ,
' db_user ' : cinema_obj . db_user ,
' db_pwd ' : cinema_obj . db_pwd
}
self . queue . put ( data )
cpu_num = cpu_count ( ) - 1 if cpu_count ( ) > 1 else 1
cinema_num = len ( all_cinema_obj )
self . th_num = cpu_num if cpu_num < cinema_num else cinema_num
def main_process ( self ) :
print ( ' main_process ' )
self . get_all_cinema ( )
while self . queue . qsize ( ) > 0 :
threads = [ ]
for i in range ( self . th_num ) :
t = threading . Thread ( target = self . get_cinema_ver , args = ( self . queue , ) )
threads . append ( t )
for i in range ( self . th_num ) :
threads [ i ] . start ( )
for i in range ( self . th_num ) :
threads [ i ] . join ( )
@staticmethod
def get_cinema_ver ( q ) :
if q . empty ( ) :
return
else :
cinema_config = q . get ( )
sql_str = " SELECT cs.cinema_id, cs.cinema_name, cs.cinema_num, cv.server_version, cv.client_version FROM cinema_set cs LEFT JOIN cinema_version cv ON 1=1; "
ip = cinema_config . get ( ' ip ' )
db_config = {
' host ' : ip ,
' user ' : cinema_config . get ( ' db_user ' ) ,
' password ' : cinema_config . get ( ' db_pwd ' ) ,
' database ' : ' cine ' ,
' connect_timeout ' : 5 ,
}
db_conn = pymysql . Connect ( * * db_config )
db_cursor = db_conn . cursor ( cursor = DictCursor )
db_cursor . execute ( sql_str )
res = db_cursor . fetchone ( )
update_data = {
' name ' : res [ ' cinema_name ' ] ,
' zz_num ' : res [ ' cinema_num ' ] ,
' inner_id ' : res [ ' cinema_id ' ] ,
' sys_ver ' : res [ ' server_version ' ] ,
' client_ver ' : res [ ' client_version ' ] ,
# 'update_time': datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
' update_time ' : timezone . now ( )
}
print ( ip , update_data , db_config )
cinema_obj = Cinema . objects . filter ( ip = ip ) . update ( * * update_data )
if __name__ == ' __main__ ' :
v = GetVersion ( )
v . get_all_cinema ( )