1.线程:执行多任务的简单方法。使用时要导入threading模块,通过threading的Thread类创建对象实例,调用start()方法调用操作系统提供的函数完成多任务,线程从创建对象的target=函数名处开始执行,执行结束后线程结束,不同线程执行顺序不确定。
import threading
import time
def sing():
for i in range(5):
print("lalala")
time.sleep(1)
def dance():
for i in range(5):
print("一起跳舞")
time.sleep(1)
def main():
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
if __name__ == "__main__":
main()
2.多线程共享全局变量
import threading
import time
def test1(temp):
temp.append(33)
print("--------in test1 temp=%s---------"%str(temp))
def test2(temp):
print("--------in test2 temp=%s---------" %str(temp))
g_nums = [11,22]
if __name__ == "__main__":
#target指明了这个线程将来去那个函数执行代码
#args指明了传递给函数的值
t1 = threading.Thread(target=test1,args=(g_nums,))
t2 = threading.Thread(target=test2,args=(g_nums,))
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("-------- g_num=%s---------" % str(g_nums))
输出结果:
--------in test1 temp=[11, 22, 33]---------
--------in test2 temp=[11, 22, 33]---------
-------- g_num=[11, 22, 33]---------
3.为解决多线程抢夺资源,创建互斥锁
import threading
import time
g_num = 0
def test1(temp):
global g_num
#锁定,如果在此之前未被锁定,那么上锁成功
#如果在此之前被锁定,那么此时被堵塞在这里,知道解锁
metux.acquire()
for i in range(temp):
g_num += 1
#解锁
metux.release()
print("--------in test1 g_num=%d---------"%g_num)
def test2(temp):
global g_num
metux.acquire()
for i in range(temp):
g_num += 1
metux.release()
print("--------in test2 g_num=%d---------" %g_num)
#创建互斥锁,默认没有上锁
metux = threading.Lock()
if __name__ == "__main__":
#target指明了这个线程将来去那个函数执行代码
#args指明了传递给函数的值
t1 = threading.Thread(target=test1,args=(10000,))
t2 = threading.Thread(target=test2,args=(10000,))
t1.start()
t2.start()
time.sleep(5)
print("-------- g_num=%d---------" %g_num)
输出结果:
--------in test1 g_num=10000---------
--------in test2 g_num=20000---------
-------- g_num=20000---------