Python threading模块介绍,threading 是 Python 高级别的多线程模块。
threading 模块的函数
- active_count() 当前活动的 Thread 对象个数
- current_thread() 返回当前 Thread 对象
- get_ident() 返回当前线程
- enumerater() 返回当前活动 Thread 对象列表
- main_thread() 返回主 Thread 对象
- settrace(func) 为所有线程设置一个 trace 函数
- setprofile(func) 为所有线程设置一个 profile 函数
- stack_size([size]) 返回新创建线程栈大小;或为后续创建的线程设定栈大小为 size
- TIMEOUT_MAX Lock.acquire(), RLock.acquire(), Condition.wait() 允许的最大值
threading 可用对象列表:
- Thread 表示执行线程的对象
- Lock 锁原语对象
- RLock 可重入锁对象,使单一进程再次获得已持有的锁(递归锁)
- Condition 条件变量对象,使得一个线程等待另一个线程满足特定条件,比如改变状态或某个值
- Semaphore 为线程间共享的有限资源提供一个”计数器”,如果没有可用资源会被阻塞
- Event 条件变量的通用版本,任意数量的线程等待某个时间的发生,在改事件发生后所有线程被激活
- Timer 与 Thread 相识,不过它要在运行前等待一段时间
- Barrier 创建一个”阻碍”,必须达到指定数量的线程后才可以继续
Thread 类
- Thread 对象的属性有:Thread.name、Thread.ident、Thread.daemon。
- Thread 对象方法:Thread.start()、Thread.run()、Thread.join(timeout=None)、Thread.getName、Thread.setName、Thread.is_alive()、Thread.isDaemon()、Thread.setDaemon()
线程调用的方法有两种:
使用函数的方式进行调用:
import threading import time def run(name): #定义要执行的函数 print("%s is talking" % name) time.sleep(3) if __name__ == "__main__": t1 = threading.Thread(target=run,args=("t1",)) #生成一个线程 t2 = threading.Thread(target=run,args=("t2",)) #生成另一个通道线程 t1.start() #启动t1线程 t2.start() #启动t2线程 输出: t1 is talking t2 is talking
A、通过类的形式调用,举例如下:
import threading,time class MyThread(threading.Thread): def __init__(self,n): super(MyThread,self).__init__() self.n = n def run(self): print("talking is %s" % self.n) if __name__ == "__main__": t1 = MyThread("t1") t2 = MyThread("t2") t1.start() t2.start() 输出: talking is t1 talking is t2
B、使用for循环,启动50个进程:
import threading import time def run(name): #定义要执行的函数 print("%s is talking" % name) time.sleep(2) start_time = time.time() for i in range(50): t = threading.Thread(target=run,args=("t-%s"% i,)) t.start() #主线程 print ("--all threading -----") print ("cost:",time.time() - start_time) #测试执行时间 输出: ....... t-48 is talking t-49 is talking --all threading ----- cost: 0.008172988891601562
Join函数的使用
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。等待第一个执行结果完成,在执行第二个,串行执行。
举例如下:
import threading import time def run(name): #定义要执行的函数 print("%s is talking" % name) time.sleep(2) start_time = time.time() for i in range(5): t1 = threading.Thread(target=run,args=("t1",)) #生成一个线程 t2 = threading.Thread(target=run,args=("t2",)) #生成另一个通道线程 t1.start() #启动t1线程 t1.join() #等待第一个线程执行完之后,在执行第二线程,串行。 t2.start() #启动t2线程 输出: t1 is talking t2 is talking t1 is talking t2 is talking t1 is talking t2 is talking t1 is talking t2 is talking t1 is talking t2 is talking --all threading ----- cost: 10.020690202713013 注:t1 输出比较快, t2输出比较慢。 t2到t1 输出比较快
上述例子是串行执行,把实力例修改为并行执行。计算50个线程执行的时间。
import threading import time def run(name): #定义要执行的函数 print("%s is talking" % name) time.sleep(2) start_time = time.time() t_jobs = [] for i in range(50): t = threading.Thread(target=run,args=("t-%s"% i,)) t.start() t_jobs.append(t) for t in t_jobs: t.join() #主线程 print ("--all threading -----") print ("cost:",time.time() - start_time) 注:使用两个for 循环,添加join函数。。达到并行处理底效果。