Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():

Thread继承

import threading
import time class MyThread(threading.Thread):
def __init__(self,n):
super(MyThread,self).__init__()
self.n = n def run(self):
print("runnint task",self.n) t1 = MyThread("t1")
t2 = MyThread("t2") t1.start() #runnint task t1
t2.start() #runnint task t2

以上是通过类的方式创建线程。

关于Thread类

构造方法: 
Thread(group=None, target=None, name=None, args=(), kwargs={}) 

  group: 线程组,目前还没有实现,库引用中提示必须是None; 
  target: 要执行的方法; 
  name: 线程名; 
  args/kwargs: 要传入方法的参数。

实例方法: 
  isAlive(): 返回线程是否在运行。正在运行指启动后、终止前。 
  get/setName(name): 获取/设置线程名。

  start():  线程准备就绪,等待CPU调度
  is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(在start之前设置)

    如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
         如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
  start(): 启动线程。 
  join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。

直接运行

将要执行的方法作为参数传给Thread的构造方法

import threading
import time
def run(n):
print("task ",n)
time.sleep(2)
print('task done',n) start_time = time.time()
for i in range(5):
t = threading.Thread(target=run,args=("t-%s" %i,))
t.start()
print('cost:',time.time() - start_time )
 task  t-0
task t-1
task t-2
task t-3
task t-4
cost: 0.0 #打印时间 停留2秒 继续执行
task done t-1
task done t-0
task done t-3
task done t-2
task done t-4

运行结果

一个程序至少有一个主线程。当一个线程启动一个子线程之后,那么相互是独立的、并行的。

主线程启动一个子线程之后并没有等待这个子线程执行完毕就往下走。

所以程序会一直执行到打印时间,也是程序结束。这个run()函数是子线程在执行,主线程执行完以后相当于创建完最后一个子线程,那么这个子线程继续执行run(),所以会等待2秒。在这之后又继续执行print('task done',n)。因为每个线程都是独立并行执行的。这个2秒是每个线程都要等待的。然后又执行print('task done',n)。

以上只是测试了一个线程创建花费了多少时间。

怎么测试这些线程创建总共花费了多少时间?

默认情况下主线程执行并不会等待子线程,并且执行完毕了以后就退出了。

那么可以设置主线程等待子线程的执行结果,就可以计算创建子线程总共花费的时间。

join

join()等待子线程执行结果。程序默认是有一个join 因为要等待所有线程执行完毕以后才退出。

import threading
import time class MyThread(threading.Thread):
def __init__(self,n):
super(MyThread,self).__init__()
self.n = n def run(self):
print("runnint task",self.n)
time.sleep(2) t1 = MyThread("t1")
t2 = MyThread("t2") t1.start()
t1.join() #等待t1执行结果(等待2s)
t2.start()

加了join之后程序等待了2s之后在执行t2,t2有等待了2s之后程序结束。

相当于把并行的程序改成了串行。

先创建线程在等待。其实和没等待是一样的。因为这个程序还是在并行执行,等待t1的过程就是在等待所有线程的过程。

import threading
import time class MyThread(threading.Thread):
def __init__(self,n):
super(MyThread,self).__init__()
self.n = n def run(self):
print("runnint task",self.n)
time.sleep(2) t1 = MyThread("t1")
t2 = MyThread("t2") t2.start()
t1.start()
t1.join() #等待t1执行结果(等待2s)
print('main thread...')

主要原因是因为每个线程的等待时间是一样的,所以看不出来,如果每个线程的创建时间不一样就可以看出效果。

import threading
import time class MyThread(threading.Thread):
def __init__(self,n,sleep_time):
super(MyThread,self).__init__()
self.n = n
self.sleep_time = sleep_time
def run(self):
print("runnint task",self.n)
time.sleep(self.sleep_time) t1 = MyThread("t1",2)
t2 = MyThread("t2",4) t1.start()
t2.start()
t1.join() #等待t1执行结果(等待2s)
print('main thread...') #等待t2执行结果(等待2s)

因为是一起创建的线程,所以等待的时间是一起计算的。要计算t2的创建时间也要等待t2结束,主程序才能结束。

import threading
import time class MyThread(threading.Thread):
def __init__(self,n,sleep_time):
super(MyThread,self).__init__()
self.n = n
self.sleep_time = sleep_time
def run(self):
print("runnint task",self.n)
time.sleep(self.sleep_time) t1 = MyThread("t1",2)
t2 = MyThread("t2",4) t1.start()
t2.start()
t1.join() #等待t1执行结果(等待2s)
t2.join() #等待t2执行结果(等待2s)
print('main thread...')
import threading
import time
def run(n):
print("task ",n)
time.sleep(2)
print('task done',n) start_time = time.time()
t_objs = [] #定义一个列表存放实例
for i in range(5):
t = threading.Thread(target=run,args=("t-%s" %i,))
t.start()
t_objs.append(t) #为了不阻塞后面的线程的启动,不在这里join 先放到一个列表里 for t in t_objs: #循环每个实例
t.join()
print('cost:',time.time() - start_time )

运行结果

task  t-0
task t-1
task t-2
task t-3
task t-4
task done t-0
task done t-4
task done t-3
task done t-2
task done t-1
cost: 2.004605770111084

参考 文章:

python--threading多线程总结

python 继承式多线程的更多相关文章

  1. 【python】-- 继承式多线程、守护线程

    继承式多线程 1.定义 继承式多线程是自己自定义类,去继承theading.Tread这个类,通过类实例.start()启动,去执行run方法中的代码. import threading import ...

  2. python高级之多线程

    python高级之多线程 本节内容 线程与进程定义及区别 python全局解释器锁 线程的定义及使用 互斥锁 线程死锁和递归锁 条件变量同步(Condition) 同步条件(Event) 信号量 队列 ...

  3. Python socket进阶 多线程/进程

    #首先,什么场合下用进程,什么场合下用线程: . 计算密集型的用进程. . IO密集型的用进程. xSocket语法及相关 Socket Families(地址簇) socket.AF_UNIX un ...

  4. python之路-----多线程与多进程

    一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...

  5. python基础之多线程与多进程(二)

    上课笔记整理: 守护线程的作用,起到监听的作用 一个函数连接数据库 一个做守护线程,监听日志 两个线程同时取一个数据 线程---->线程安全---->线程同时进行操作数据. IO操作--- ...

  6. python基础之多线程与多进程(一)

    并发编程? 1.为什么要有操作系统? 操作系统,位于底层硬件与应用软件之间 工作方式:向下管理硬件,向上提供接口 2.多道技术? 不断切换程序. 操作系统进程切换: 1.出现IO操作 2.固定时间 进 ...

  7. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  8. python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  9. python中的多线程【转】

    转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...

随机推荐

  1. fluent中UDF环境变量问题的三种解决方法

    方法一: 这种方式最简便,首选这种,但是有时会因为不明原因而不好使,我自己电脑刚开始用这种方式是行得通的,但是后来中途装过很多乱七八糟的软件,估计环境变量改乱了,这时候只能用第二种或者第三种方法.先说 ...

  2. LeetCode162.寻找峰值

    162.寻找峰值 描述 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下 ...

  3. C#异步编程之基于任务的异步模式

    http://www.cnblogs.com/afei-24/p/6757361.html该文讲了基于任务的编程,这里再详细介绍一下.一.延续任务 private async static void ...

  4. C++ STL之Set

    set是关联容器,类似于集合. 特点是里面的元素不会重复,而且元素时有序的. 1.声明定义: #include<set> using namespace std; set<int&g ...

  5. Spring 配置 Apache Commons Logging

    第一次用spring framework,刚配了个最简单的项目,启动出现如下错误,查了知道原来spring要依赖Apache common logging包.只需要添加到项目library中即可.可从 ...

  6. 小问题总结:鼠标点击到输入框(input)里的时候,输入框的提示消失,鼠标再移开,输入框提示出现

    问题如标题: 鼠标点击到输入框(input)里的时候,输入框的提示消失,鼠标再移开,输入框提示出现.如图所示:   做法如下: <input type="text" name ...

  7. PIE SDK波段合成

    1.算法功能简介 波段合成功能主要用于将多幅图像合并为一个新的多波段图像(即波段的叠加打包,构建一个新的多波段文件),从而可根据不同的用途选择不同波长范围内的波段合成 RGB 彩色图像. PIE支持算 ...

  8. Java调度线程池ScheduleExecutorService

    如果在一个ScheduleExecutorService中提交一个任务,这个任务的调度周期设置 的时间比任务本身执行的时间短的话会出现什么情况?也就是在线程调度时间已经到了 但是上次的任务还没有做完的 ...

  9. rancher2.X搭建k8s集群平台

    一, 新版特性 Rancher 1.6支持多种容器编排框架,包括Kubernetes.Mesos.Docker Swarm,默认的基础编排引擎是Cattle,Cattle极简的操作体验受到了大量开源社 ...

  10. shell 对字符的求长

    一,测试环境 echo "To the world you may be one person but to one person you may be the world" 对于 ...