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')