threading要优于thread。
因为Python存在GIL(全局解释器锁),防止多个线程同时被执行,所以当我们程序是IO密集型才使用多线程,如果是计算密集型需要使用多进程提高效率。
import threading
print(threading.active_count()) #显示运行线程数 --2
print(threading.enumerate()) #显示运行的线程明细 --[<_MainThread(MainThread, started 8636)>, <Thread(SockThread, started daemon 8644)>]
print(threading.current_thread()) #显示当前执行的线程 --<_MainThread(MainThread, started 8636)>
def thread_job():
print('This is an added Thread, number is %s'% threading.current_thread()) #定义一个函数
added_thread = threading.Thread(target=thread_job) #绑定一个线程
added_thread.start() --This is an added Thread, number is <Thread(Thread-1, started 11440)> #启动
因为threading会遇到执行顺序的问题,此时需要增加join():
added_thread = threading.Thread(target=thread_job,name='T1',args=(1,) #可定义一个别名,args用于传参
added_thread.join() #确保执行完added_thread()才执行下面的print
print('all done\n')
如果遇上两个函数共用一个全局变量时,此时需要增加lock():
import threading
def job1():
global A,lock
lock.acquire()
for i in range(10):
A += 1
print('job1',A)
lock.release()
def job2():
global A,lock
lock.acquire()
for i in range(10):
A += 10
print('job2',A)
lock.release()
if __name__ == '__main__':
lock = threading.Lock()
A = 0
t1 = threading.Thread(target=job1)
t2 = threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
输出结果为:

网友评论