python中对多线程的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28847617/article/details/87191605

(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,)]。说明已经开启的多线程模式来处理事件,同时进行执行完结果的优先输出结果集。

猜你喜欢

转载自blog.csdn.net/qq_28847617/article/details/87191605