多线程
python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。但是python由于GIL(global interpreter lock 全局解释锁)的存在无法使用threading充分利用CPU资源,GIL使得python同一个时刻只有一个线程在一个cpu上执行字节码,并且无法将多个线程映射到多个cpu上,即不能发挥多个cpu的优势。即多线程只能在一个CPU上执行,CPU是按照时间片轮询的方式来执行子线程的。
创建一个线程
第一种形式
from threading import Thread
import time
def test():
print("---我爱你,老婆----")
time.sleep(1)
for i in range(5): #父线程等子线程
t=Thread(target=test) #主线程创建5个子线程完成任务
t.start(
创建一个线程需要一个库 threading库,使用该库中的 Thread创建一个线程,
第二种形式
import threading
import time
class M(threading.Thread):
def run(self):
for i in range(10):
time.sleep(1)
msg="I`m"+self.name+"@"+str(i)
print(msg)
def test():
for i in range(5):
t = M()
t.start()
if __name__=="__main__":
test()
我么可以设置一个类,直接继承该库中的Thread模块,重新写父类方法中的run发放
这也是一种创建线程的形式
线程中的传参与数据共享
from threading import Thread
import time
def work1(nums):
nums.append(44)
print("----in work1---",nums)
def work2(nums):
#延时一会,保证t1线程中的事情做完
time.sleep(1)
print("----in work2---",nums)
g_nums = [11,22,33]
t1 = Thread(target=work1, args=(g_nums,))
t1.start()
t2 = Thread(target=work2, args=(g_nums,))
t2.start()
线程传递参数使用args传递,传递的参数如果是一个的话就要以元组传递,
避免多线程对共享数据出错的方式
from threading import Thread
g_num = 0
g_flag = 1
def test1():
global g_num
global g_flag
if g_flag == 1:
for i in range(1000000):
g_num += 1
g_flag = 0
print("---test1---g_num=%d"%g_num)
def test2():
global g_num
#轮询
while True:
if g_flag != 1:
for i in range(1000000):
g_num += 1
break
print("---test2---g_num=%d"%g_num)
p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test2)
p2.start()
print("---g_num=%d---"%g_num)
多线程共享数据可能会混乱,可以使用轮询的方式控制线程的进行,从而使线程之间数据的准确