(1)、先上代码:
#coding=gbk
import time
import threading
#######################时间字符串格式#########################
today=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())######返回当前系统时间
print("程序【开始】运行时间:",today)
#############################################################
#
# --------- 创建数据库链接来测试线程 ------------------
#
#############################################################
import cx_Oracle
#############################################################
#
# --------- 启动线程去执行同一个方法,去完成多个事件 ---------
#
#############################################################
def do_event(*table_names):#########统计表数据大小
ref_condb=cx_Oracle.connect('数据库用户名','数据库密码','TNS连接数据库标识符')
for table_name in table_names:
current_cursor=ref_condb.cursor()
srt_sql="select count(1) from %s" % (table_name)
print("执行的SQL语句是:",srt_sql)
current_cursor.execute(srt_sql)
count_total=current_cursor.fetchall()
print("当前表名:%s,统计到的数据行数为:" % (table_name),count_total)
current_cursor.close()
ref_condb.close()
########创建一个线程对象
table_names=['GPON_ONU_FLOW','a_hwptn_lbs_15','GLC_FORM_INFO','GLC_FAULT_MAIN','rms_city','rms_equiproom']
leiji=0
xc_list=[]
for table_name in table_names:
datas=[]
xa='x'+str(leiji)
print("新的线程对象名:",xa)
xa=threading.Thread(target=do_event,args=(table_name,),name='查询表行数的多线程')#####循环封装成多线程对象
xc_list.append(xa)
xa.setDaemon(False)
xa.start()#####开始启动线程
leiji=leiji+1
#############返回当前执行线程数量###########
cx_total=threading.activeCount()###可以返回启动的线程
print("第一次测试当前线程数量:",cx_total)
print("当前线程列表:",threading.enumerate())
##############这里必须控制一下多线程是否都执行完了##########
###########join()方法是设置了一道门槛,等待所以都结束#################
#
# --------如果不设置门槛的话,一次性就执行完所以的,不等待子线程
#
######################################################################
for xc_name in xc_list:
if xc_name.isAlive():
print("【第一次测试】当前的线程名:%s >>>>>>>>>>>[还在活跃]" % (xc_name))
xc_name.join()###等待多线程正常结束退出
else:
print("【第一次测试】当前的线程名:%s >>>>>>>>>>>[停止活跃]" % (xc_name))
print("第二次测试当前线程数量:",threading.activeCount())
print("当前线程列表:",threading.enumerate())
print("线程执行完,可以继续往下执行进程")
###########################################################################
#
# -----最后再测试线程个数
#
###########################################################################
for xc_name in xc_list:
if xc_name.isAlive():
print("【第二次测试】当前的线程名:%s >>>>>>>>>>>[还在活跃]" % (xc_name))
xc_name.join()###等待多线程正常结束退出
else:
print("【第二次测试】当前的线程名:%s >>>>>>>>>>>[停止活跃]" % (xc_name))
today=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())######返回当前系统时间
print("程序【结束】运行时间:",today)
(2)、运行结果:
序【开始】运行时间: 2019-02-13 17:03:25
新的线程对象名: x0
新的线程对象名: x1
新的线程对象名: x2
新的线程对象名: x3
新的线程对象名: x4
新的线程对象名: x5
第一次测试当前线程数量: 7
当前线程列表: [<_MainThread(MainThread, started 140340063246080)>, <Thread(查询表行数的多线程, started 140339942536960)>, <Thread(查询表行数的多线程, started 140339885168384)>, <Thread(查询表行数的多线程, started 140339801224960)>, <Thread(查询表行数的多线程, started 140339790735104)>, <Thread(查询表行数的多线程, started 140339780245248)>, <Thread(查询表行数的多线程, started 140339769755392)>]
【第一次测试】当前的线程名:<Thread(查询表行数的多线程, started 140339942536960)> >>>>>>>>>>>[还在活跃]
执行的SQL语句是: select count(1) from a_hwptn_lbs_15
执行的SQL语句是: select count(1) from rms_city
执行的SQL语句是: select count(1) from GLC_FORM_INFO
当前表名:rms_city,统计到的数据行数为: [(17,)]
执行的SQL语句是: select count(1) from GPON_ONU_FLOW
执行的SQL语句是: select count(1) from rms_equiproom
执行的SQL语句是: select count(1) from GLC_FAULT_MAIN
当前表名:GLC_FORM_INFO,统计到的数据行数为: [(211623,)]
当前表名:GLC_FAULT_MAIN,统计到的数据行数为: [(23085,)]
当前表名:rms_equiproom,统计到的数据行数为: [(187742,)]
当前表名:a_hwptn_lbs_15,统计到的数据行数为: [(22916324,)]
当前表名:GPON_ONU_FLOW,统计到的数据行数为: [(141686104,)]
【第一次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339885168384)> >>>>>>>>>>>[停止活跃]
【第一次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339801224960)> >>>>>>>>>>>[停止活跃]
【第一次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339790735104)> >>>>>>>>>>>[停止活跃]
【第一次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339780245248)> >>>>>>>>>>>[停止活跃]
【第一次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339769755392)> >>>>>>>>>>>[停止活跃]
第二次测试当前线程数量: 1
当前线程列表: [<_MainThread(MainThread, started 140340063246080)>]
线程执行完,可以继续往下执行进程
【第二次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339942536960)> >>>>>>>>>>>[停止活跃]
【第二次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339885168384)> >>>>>>>>>>>[停止活跃]
【第二次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339801224960)> >>>>>>>>>>>[停止活跃]
【第二次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339790735104)> >>>>>>>>>>>[停止活跃]
【第二次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339780245248)> >>>>>>>>>>>[停止活跃]
【第二次测试】当前的线程名:<Thread(查询表行数的多线程, stopped 140339769755392)> >>>>>>>>>>>[停止活跃]
程序【结束】运行时间: 2019-02-13 17:07:03
(3)、总结:
通过多线程可以实现不同事件调用同方法,并行完成的效果,事件与事件之间不需要等待上一个事件结束,才开始下一个事件。代码中列表循环顺序先后为:table_names=['GPON_ONU_FLOW','a_hwptn_lbs_15','GLC_FORM_INFO','GLC_FAULT_MAIN','rms_city','rms_equiproom'],但是先后完成事件顺序是:当前表名:rms_city,统计到的数据行数为: [(17,)]、当前表名:GLC_FORM_INFO,统计到的数据行数为: [(211623,)]、当前表名:GLC_FAULT_MAIN,统计到的数据行数为: [(23085,)]、当前表名:rms_equiproom,统计到的数据行数为: [(187742,)]、当前表名:rms_equiproom,统计到的数据行数为: [(187742,)]、当前表名:GPON_ONU_FLOW,统计到的数据行数为: [(141686104,)]。说明已经开启的多线程模式来处理事件,同时进行执行完结果的优先输出结果集。