6、第七 - 网络编程基础 - 继承式多线程
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函数。。达到并行处理底效果。
人有傲骨终不贱,脚踏实地见真章;
超出预期为工作,价值体现显能力。
浙公网安备 33010602011771号