对于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) + " " + 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