一、线程的一些基本操作
import threading
print(threading.active_count()) #返回当前存活的线程数量 输出1
print(threading.enumerate()) #返回当前所有存活的线程列表 输出[<_MainThread(MainThread, started 6656)>]
print(threading.current_thread()) #返回当前所使用的线程 输出 <_MainThread(MainThread, started 6656)>
print(threading.main_thread()) #返回主线程 输出<_MainThread(MainThread, started 6656)>
print(threading.get_ident()) #返回线程的标识符 输出6656
def job():
print("test")
def main():
add_thread = threading.Thread(target=job) #添加一个新线程
add_thread.start() #开始使用线程
if __name__ == '__main__':
main()
二、通过join()函数来有序的执行线程任务。
先举个没有join()函数的线程执行例子
import threading
import os
import time
def work1():
for i in range(4):
time.sleep(0.5)
print("work1")
def work2():
for i in range(4):
time.sleep(0.5)
print("work2")
def main():
thread_add1 = threading.Thread(target=work1)
thread_add1.start()
thread_add2 = threading.Thread(target=work2)
thread_add2.start()
main()
输出如下,可以发现线程的执行是并发的,意思就是线程是一起执行的,没有说要你这个线程执行完再执行下一个线程,如果你要这样做,用join函数就OK了

来看一下加入join函数的代码
import threading
import os
import time
def work1():
for i in range(4):
time.sleep(0.5)
print("work1")
def work2():
for i in range(4):
time.sleep(0.5)
print("work2")
def main():
thread_add1 = threading.Thread(target=work1,name="work1") #name参数:给线程命名
thread_add1.start()
thread_add1.join()
thread_add2 = threading.Thread(target=work2,name="work2")
thread_add2.start()
main()
可以发现,只有等work1执行完后才能执行work2

三、给线程开锁上锁,简单来说就是把锁打开让你执行工作,工作完后再上锁,个人感觉和join函数差不多吧
import threading
import os
import time
lock = threading.Lock()
def work1():
lock.acquire()
for i in range(4):
time.sleep(0.5)
print("work1")
lock.release()
def work2():
lock.acquire()
for i in range(4):
time.sleep(0.5)
print("work2")
lock.release()
def main():
thread_add1 = threading.Thread(target=work1,name="work1") #name参数:给线程命名
thread_add1.start()
thread_add2 = threading.Thread(target=work2,name="work2")
thread_add2.start()
main()
通过输出可以看到只有等work1工作完后work2才能工作

利用with函数你就可以不写上锁解锁这两行代码了,和文件打开和关闭差不多。
import threading
import os
import time
lock = threading.Lock()
def work1():
with lock:
for i in range(4):
time.sleep(0.5)
print("work1")
def work2():
with lock:
for i in range(4):
time.sleep(0.5)
print("work2")
def main():
thread_add1 = threading.Thread(target=work1,name="work1") #name参数:给线程命名
thread_add1.start()
thread_add2 = threading.Thread(target=work2,name="work2")
thread_add2.start()
main()
四、有时候线程数太多一起执行,会给cpu添加负担,这时候我们就要控制线程同时执行的数量了。
利用到threading的BoundedSemaphore类
import threading
import os
import time
semaphore = threading.BoundedSemaphore(5) #设置只能允许5个线程同时进行
def work1(se):
se.acquire()
print("test")
se.release()
def main():
for i in range(1,15):
thread = threading.Thread(target=work1,args=(semaphore,)) #这里要挺注意的,args如果只传一个参数就得加个逗号
thread.start()
main()
输出如下
