import threading, time
def download(s):
photo = ['man.jpg', 'woman.jpg', 'child.jpg', 'dog.jpg', 'cat.jpg']
for picture in photo:
time.sleep(s)
print('下载{}成功'.format(picture))
def listenMusic(s):
music = ['1.mp3', '2.mp3', '3.mp3']
for listen in music:
time.sleep(s)
print('正在听{}'.format(listen))
if __name__ == '__main__':
# 线程对象
t1 = threading.Thread(target=download, name='下载照片', args=(1,))
t1.start()
t2 = threading.Thread(target=listenMusic, name='听歌',args=(1,))
t2.start()
n = 1
while True:
print(n)
time.sleep(1.5)
n += 1
--------------------------------------
1
正在听1.mp3下载man.jpg成功
2
正在听2.mp3
下载woman.jpg成功
下载child.jpg成功
正在听3.mp3
3
下载dog.jpg成功
4
下载cat.jpg成功
5
6
7
import threading
money = 1000
def run1():
global money
for i in range(100):
money -= 1
def run2():
global money
for i in range(100):
money -= 1
if __name__ == '__main__':
t1 = threading.Thread(target=run1,name='测试1')
t2 = threading.Thread(target=run2, name='测试2')
t1.start()
t2.start()
#保证t1,t2 均启动完在插队(插队在print(money)前面)
t1.join()
t2.join()
# 由结果可知,对于全局变量,线程可共享
print(money)
-------------------------------------------
800
多线程的优势在于可以同时运行多个任务,(python伪多线程)
但是当线程需要数据共享时,可能存在数据不同步的问题。
为了避免这种情况,引入了锁的概念
lock = threading.Lock()
lock = threading.acquire()
....
lock = threading.release()
只要不释放锁,其他线程都无法进入运行状态
import threading,time
list = [0] * 10
lock = threading.Lock()
def run1():
lock.acquire()# 请求锁,如果锁被占用,则等待
for i in range(len(list)):
time.sleep(0.5)
list[i] += 1
lock.release() # 释放锁
def run2():
lock.acquire() # 请求锁,如果锁被占用,则等待
for i in range(len(list)):
time.sleep(0.5)
print('这是run2,当前i的值为:',i)
lock.release() # 释放锁
if __name__ == '__main__':
t1 = threading.Thread(target=run1)
t2 = threading.Thread(target=run2)
t1.start()
t2.start()
==============================================
这是run2,当前i的值为: 0
这是run2,当前i的值为: 1
这是run2,当前i的值为: 2
这是run2,当前i的值为: 3
这是run2,当前i的值为: 4
这是run2,当前i的值为: 5
这是run2,当前i的值为: 6
这是run2,当前i的值为: 7
这是run2,当前i的值为: 8
这是run2,当前i的值为: 9