Python0016多线程
1.多线程简介
现代的高级编程语言中,几乎所有语言都支持多线程。多线程很实用,即便是在单核处理器上多线程仍然是实用的。
在安卓开发中,安卓系统强制一个线程处理图形界面,其他线程处理逻辑。这样的好处是用户图形界面流畅。IOS开发,C#桌面应用程序中也是如此的。曾经写安卓代码阻塞过UI线程,在手机上的效果是:系统弹出一个提示框XXXX没有响应。通常情况下,手机app出现类似的提示,都是因为开发人员在UI线程中进行了大量的运算导致的,这样做用户体验非常差。
在基于多核心多线程CPU的图像视频处理程序中,由于要进行大量的运算,通常使用多线程来处理,可以达到缩短运行时间的效果。如果在单核单线程一个处理器的机器上,多线程不能缩短执行时间,而且还能增加执行时间。
使用多线程过程中问题也很多,多个线程间是共享数据的,这时候会出现线程安全问题。假设a,b线程共同使用变量sum。a中执行的是sum=0 sum=1+2 print sum,b中执行sum=1 sum=3+4 print sum。由于a,b两个线程共同执行,那么这六条语句有多种执行顺序,下面列举两种:
(1)正常
a: sum=0
a: sum=1+2
a: print sum #输出3
b: sum=1
b: sum=3+4
b: print sum #输出7
(2)异常
b: sum=1
b: sum=3+4
a: sum=0
a: sum=1+2
b: print sum #输出3
a: print sum #输出3
出现这种问题后,就要用到线程锁,线程同步机制等。当同时使用多个线程锁时还可能出现死锁。
2.python中的多线程
在python中有两种创建线程的方式:
(1)写一个要再子线程中执行的函数,传给Thread类
import threading import time #把函数传给Thread def print_number(number): #下面一行是为了让结果看起来更自然,让线程休眠100ms,可以去掉 time.sleep(0.1) print("thread_id:",threading.current_thread().ident," num:",number) threads=[] #下面创建了10个线程 for i in range(10): #target 要执行的函数 args 要执行函数的参数 注意:(i,)最后一个参数一定要这样写,否则会有问题,具体原因还没有探究 t=threading.Thread(target=print_number,args=(i,)) threads.append(t) #启动线程 for t in threads: t.start() # 某次运行结果: # thread_id: 123145321340928 num: 0 # thread_id: 123145331851264 num: 2 # thread_id: 123145326596096 num: 1 # thread_id: 123145337106432 num: 3 # thread_id: 123145342361600 num: 4 # thread_id: 123145368637440 num: 9 # thread_id: 123145358127104 num: 7 # thread_id: 123145347616768 num: 5 # thread_id: 123145363382272 num: 8 # thread_id: 123145352871936 num: 6
(2)继承Thread类,重写run方法
import threading import time #继承Thread对象,重写run方法 class PrintNumThread(threading.Thread): def __init__(self,number): super(PrintNumThread,self).__init__() self.number=number def run(self): #下面一行是为了让结果看起来更自然,让线程休眠100ms,可以去掉 time.sleep(0.1) print("thread_id:",threading.current_thread().ident," num:",self.number) threads=[] #下面创建了10个线程 for i in range(10): threads.append(PrintNumThread(i)) #启动这10个线程 for t in threads: t.start() # 某次运行结果: # thread_id: 123145426317312 num: 0 # thread_id: 123145431572480 num: 1 # thread_id: 123145436827648 num: 2 # thread_id: 123145447337984 num: 4 # thread_id: 123145452593152 num: 5 # thread_id: 123145463103488 num: 7 # thread_id: 123145442082816 num: 3 # thread_id: 123145457848320 num: 6 # thread_id: 123145468358656 num: 8 # thread_id: 123145473613824 num: 9