python之多线程threading模块的使用

一、线程的一些基本操作

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()

输出如下

posted @ 2021-01-14 10:11  亨利其实很坏  阅读(380)  评论(0)    收藏  举报