目录
一、线程常用方法
t.start(),当前线程准备就绪(等待CPU调度,具体时间是由CPU来决定)。
t.join()
,等待当前线程的任务执行完毕后再向下继续执行。
import time
from threading import Thread,Lock
number = 0
"""
线程会修改全局变量的值,局部变量的值会改变么?
"""
lock=Lock()
def fun1():
global number
for i in range(1000000):
lock.acquire()
number += 1
lock.release()
print('fun1,number变量值为:', number)
def fun2():
global number
for i in range(1000000):
lock.acquire()
number += 1
lock.release()
print('fun2,number变量值为:', number)
if __name__ == '__main__':
t1 = Thread(target=fun1)
t2 = Thread(target=fun2)
t1.start()
t2.start()
t1.join()
t2.join()
二、线程池
批量下载图片
img.txt
weiwei,https://lmg.jj20.com/up/allimg/4k/s/02/210924224R45162-0-lp.jpg
jiangge,https://up.enterdesk.com/edpic_source/aa/9f/af/aa9faf91f2c01c02cf216fd24c1705de.jpg
huanrong,https://img.tukuppt.com/photo-big/00/01/77/618c7528d1be37922.jpg
xiaohong,https://up.enterdesk.com/edpic_source/ce/0c/52/ce0c5214f3741faedfdee5c69ee513bc.jpg
damei,https://up.enterdesk.com/edpic_source/b9/4a/e9/b94ae9e9f03d895eeadf5e0f9f210382.jpg
import requests
from concurrent.futures import ThreadPoolExecutor
def download(image_url):
res = requests.get(
url=image_url,
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
}
)
return res
def flie_name_param(file_name):
def save_img(response):
res = response.result()
# 将下载的图片的内容写入到文件
with open(file_name, mode='wb') as f:
f.write(res.content)
return save_img
pool = ThreadPoolExecutor(7)
with open("img.txt", mode='r', encoding='utf-8') as f:
for line in f:
name, url = line.split(',')
file_name = "{}.jpg".format(name).strip()
url = url.strip()
fur = pool.submit(download, url)
# 回调,通过闭包的方式传递参数
fur.add_done_callback(flie_name_param(file_name))
三、线程锁
import time
from threading import Thread, Lock
number = 0
"""
线程会修改全局变量的值
"""
lock = Lock()
def fun1():
global number
for i in range(1000000):
lock.acquire()
number += 1
lock.release()
print('fun1,number变量值为:', number)
def fun2():
global number
for i in range(1000000):
lock.acquire()
number += 1
lock.release()
print('fun2,number变量值为:', number)
if __name__ == '__main__':
t1 = Thread(target=fun1)
t2 = Thread(target=fun2)
t1.start()
t2.start()
t1.join()
t2.join()