Python 多线程-GIL问题

 

Python 多线程GIL问题(GIL全局解释器):

  由于python解释器自身设计的需求,只能允许一个线程进行工作,无论你开启多少个线程,python在执行任务的时候在同一时刻只能允许一个线程允许。

  应为GIL的问题,多个线程同一时刻只能有一个执行权限,多个线程会争取这个执行权限,造成多个线程来回的切换,造成时间的消耗。

 

 

 

IO密集型:推荐使用多线程, 应为遇见IO阻塞时候( time.sleep ),会切换到另外其他线程工作;但是会有切换消耗。解决方法(多进程+协程)

 

计算密集型:不推荐使用多线程,因为不会发生IO阻塞,直到一个线程结束后才会开始另外一个线程,  

 

  

from  common.sdpdbutils import SQLServer

import threading,time

def select(host,thread_name):
    print('%s开始执行时间:%s'%(thread_name,time.ctime()))
    sql="SELECT * FROM HISTASK   WHERE CONVERT(datetime,HISDT) BETWEEN %s AND %s"
    db = SQLServer(host)
    result = db.fetchall_by_params(sql,  '2020-12-01 00:00', '2021-01-01 00:00')
    db.close()
    print('%s结束执行时间:%s'%(thread_name, time.ctime()))


if __name__ =='__main__':
   # 采用GIL方式的多线程执行任务消耗时间为 36秒
    t1=threading.Thread(target=select,args=({'host':'10.214.132.36','user':'amhs','password':'gzsdp','db':'SDP1STK1800','charset':'GBK'},threading.Thread().getName(),))
    t2=threading.Thread(target=select,args=({'host':'10.214.132.39','user':'amhs','password':'gzsdp','db':'SDP1STK1900','charset':'GBK'},threading.Thread().getName(),))
    t3=threading.Thread(target=select,args=({'host':'10.214.132.42','user':'amhs','password':'gzsdp','db':'SDP1STK2000','charset':'GBK'},threading.Thread().getName(),))
    t1.start()
    t2.start()
    t3.start()
   # 采用普通调用函数的方式执行任务消耗时间为 17秒
   # select({'host':'10.214.132.36','user':'amhs','password':'gzsdp','db':'SDP1STK1800','charset':'GBK'},'Thread-1') 
#
select({'host':'10.214.132.39','user':'amhs','password':'gzsdp','db':'SDP1STK1900','charset':'GBK'},'Thread-3')
#
select({'host': '10.214.132.42', 'user': 'amhs', 'password': 'gzsdp', 'db': 'SDP1STK2000', 'charset': 'GBK'},'Thread-5')

 

 

 

  

posted @ 2021-01-09 14:13  leungqingyun  阅读(439)  评论(0编辑  收藏  举报