6第七周-网络编程-继承式多线程

Posted chen170615

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

 线程调用的方法有两种:

1、直接调用

使用函数的方式进行调用:

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
2、继承式多线程

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函数。。达到并行处理底效果。

 

以上是关于6第七周-网络编程-继承式多线程的主要内容,如果未能解决你的问题,请参考以下文章

7第七周-网络编程-守护进程

python-- 继承式多线程守护线程

12第七周-网络编程 - 线程中的信号量(Semaphore)

20172322 《程序设计与数据结构》第七周学习总结

17第七周-网络编程 - 协程概念介绍协程gevent模块并发爬网页

第七周收获