import time
from threading import Semaphore, Thread
defget_html_url(s, t):with s:# s.acquire() value -1 #s.release() value +1# 当value = 0 会堵塞print(f"{t}")
time.sleep(2)if __name__ =='__main__':
s = Semaphore(3)# 控制线程数量for i inrange(20):
t = Thread(target=get_html_url, args=(s, i))
t.start()
三、线程池
#主要要去了解源码,submit返回的future对象import time
from concurrent.futures import ThreadPoolExecutor,as_completed
# as_completed接受iterable ,iterable中是Future对象deffunc(*args):
time.sleep(2)print(args)
executor = ThreadPoolExecutor(3)#线程池的实例对象中有map方法,map(func,iterable) # iterable为函数的参数for i inrange(10):
future=executor.submit(func,(1,2,3))
future,done()#线程运行状态
future.cancel()#取消还未运行的线程
future.result()#线程运行结果,会堵塞# map 和as_completed都是的返回值都是iterable 可以用for循环