对于python的多线程,也就是threading模块,从开始学到现在,依旧觉得麻烦,对,依旧这么感觉。时隔已久,来整理一下。

 

 线程对象的方法:

 

  • Start() 开始线程的执行
  • Run() 定义线程的功能的函数
  • Join(timeout=None) 程序挂起,直到线程结束;如果给了timeout,则最多阻塞timeout秒
  • getName() 返回线程的名字
  • setName() 设置线程的名字
  • isAlive() 布尔标志,表示这个线程是否还在运行
  • isDaemon() 返回线程的daemon标志
  • setDaemon(daemonic) 把线程的daemon标志设为daemonic(一定要在start()函数前调用)
  • t.setDaemon(True) 把父线程设置为守护线程,当父进程结束时,子进程也结束。

 

threading类的方法:

 

  • threading.enumerate() 正在运行的线程数量

 

 两种创建多线程的方式

使用Thread()函数创建线程。

import threading
import time

# 多线程A
def fun(i):
    print(str(i) + "\t" + time.strftime('%X'))

for i in range(10):
    t = threading.Thread(target=fun, args=(i,))
    t.start()

另一种通过继承threading类的方式,重写了run函数:

import threading
import time

# 多线程B
class myThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        try:
            print("success input " + time.strftime('%X'))
        except:
            pass


for i in range(10):
    th = myThread()
    th.start()

for i in range(10):
    th.join()

多线程获取返回值

python的多线程本身没有获取返回值的函数,继承threading类,然后写一个获取返回值的函数get_result。

import threading
import time

# 多线程获取返回值
class myThread(threading.Thread):
    def __init__(self, func, args=()):
        threading.Thread.__init__(self)
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result
        except Exception:
            pass


def fun():
    return time.strftime('%Y-%m-%d %X')

threads = []

for i in range(20):
    t = myThread(fun)
    t.start()
    threads.append(t)
    
for i in range(len(threads)):
    print(threads[i].get_result())
    threads[i].join()

控制并发线程数的两种方法

当执行任务特别多是,就需要控制并发线程数,threading类自带的方法。

import threading
import time

# 控制线程数A
thread_nums = 10

set_thread_nums = threading.BoundedSemaphore(thread_nums)

class myThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        set_thread_nums.acquire()
        try:
            a = 1
            print("The result is :{0} in {1}".format(a, time.strftime("%Y-%m-%d %X")))
            time.sleep(1)
        except:
            pass
        finally:
            set_thread_nums.release()
    

for i in range(20):
    t = myThread()
    t.start()

for i in range(20):
    t.join()

也可以自己编写。

import threading
import time

# 控制线程数B
threads = []

def fun():
    print(time.strftime("%Y-%m-%d %X"))
    time.sleep(1)

for i in range(10):
    t = threading.Thread(target=fun)
    threads.append(t)

for i in range(len(threads)):
    threads[i].start()
    while True:
        if len(threading.enumerate()) < 3:
            break