1.单线程
import time
def test_1(para):
print('start_%s' % para)
time.sleep(2)
print('end_%s' % para)
def test_2(para):
print('start_%s' % para)
time.sleep(1)
print('end_%s' % para)
if __name__ == '__main__':
test_1('test1')
test_2('test2')
结果,永远都是 test_1() 完成后执行 test_2()
start_test1
end_test1
start_test2
end_test2
2,多线程
threading.Thread(group=None, target=None, name=None,args=(), kwargs=None, *, daemon=None)
import threading
import time
def test_1(para):
print('start_%s' % para)
time.sleep(2)
print('end_%s' % para)
def test_2(para):
print('start_%s' % para)
time.sleep(1)
print('end_%s' % para)
if __name__ == '__main__':
t1 = threading.Thread(target=test_1, args=('test1',)) #test_1为函数名,不要加括号,args写入参
t2 = threading.Thread(target=test_2, args=('test2',))
t1.start() #开始一个线程
t2.start()
结果,t1先开始后结束
start_test1
start_test2
end_test2
end_test1
3.守护进程
setDaemon(True)
主线程结束,子线程也会结束
import threading
import time
def test_1(para):
print('start_%s' % para)
time.sleep(2)
print('end_%s' % para)
def test_2(para):
print('start_%s' % para)
time.sleep(1)
print('end_%s' % para)
if __name__ == '__main__':
t1 = threading.Thread(target=test_1, args=('test1',))
t2 = threading.Thread(target=test_2, args=('test2',))
t1.setDaemon(True)
t2.setDaemon(True)
t1.start()
t2.start()
print('结束了')
结果,主线程结束子线程还没跑完就结束了
start_test1
start_test2
结束了
4.join
在start方法之后使用,会一直运行完此线程
import threading
import time
def test_1(para):
print('start_%s' % para)
time.sleep(2)
print('end_%s' % para)
def test_2(para):
print('start_%s' % para)
time.sleep(1)
print('end_%s' % para)
if __name__ == '__main__':
t1 = threading.Thread(target=test_1, args=('test1',))
t2 = threading.Thread(target=test_2, args=('test2',))
t1.setDaemon(True)
t2.setDaemon(True)
t1.start()
t2.start()
t2.join()
print('结束了')
结果
start_test1
start_test2
end_test2
结束了
5.线程锁
没加锁
import threading
count = 0
def test_1(num):
global count
for i in range(num):
count += 1
print(count)
if __name__ == "__main__":
t1 = threading.Thread(target=test_1, args=(1000000,))
t2 = threading.Thread(target=test_1, args=(1000000,))
t1.start()
t2.start()
结果,把循环次数放大会发现结果每次不一样由于2个线程争抢一个资源导致
1699003
1749908
加锁
import threading
count = 0
lock = threading.Lock()
def test_1(num):
global count
lock.acquire()
for i in range(num):
count += 1
lock.release()
print(count)
if __name__ == "__main__":
t1 = threading.Thread(target=test_1, args=(1000000,))
t2 = threading.Thread(target=test_1, args=(1000000,))
t1.start()
t2.start()
结果
1000000
2000000