Python多为线程编程提供了两个简单明了的模块:thread和threading,Python3中已经不存thread模块,已经被改名为_thread,实际优先使用

threading模块。

1.Python创建线程的两种方法:

①:创建一个threading.Thread对象,在其初始化函数中将可调用对象作为参数传入

import threading
def handle(sid):
print("Thread %d run"%sid) #创建线程方法1
for i in range(1, 11):
t = threading.Thread(target=handle, args=(i,))
t.start()
print("main thread")

②:通过继承Thread类,重写它的run()方法

import threading
def handle(sid):
print("Thread %d run"%sid)
class MyThread(threading.Thread):
def __init__(self,sid):
threading.Thread.__init__(self)
self.sid = sid
def run(self):
handle(self.sid) for i in range(1,11):
t = MyThread(i)
t.start()
print("main thread")

2.threading.Thread对象:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group :这个应该为空,是个保留位,是为了以后ThreadGroup(线程组)这个类实现而预留的
target:是个由run()方法执行调用的可调用对象,也就是线程要执行的函数,默认为空,意味着没有东西可以被调用
name: 这个参数表示线程的名称,默认情况下,是一个类似于Thread-N形式的名字,这里的N是小的十进制失踪
args: 这是个参数元组,是用来给target调用的,默认为一个空的元组
kwargs={} : 这是个关键字参数组成的字典,是用来给target调用的,默认为一个空的字典
daemon 这个bool值表明这个线程是否是守护进程,当为True时,就是个守护进程,否则为False,就不是守护进程

这个必须在start()之前被设置,否则就会抛出RuntimeError异常,它的初始值继承于创建它的线程,如果主进程不是守护进程,
那么由主进程创建的子进程默认都不是守护进程

3.start方法与run方法

启动线程是调用start方法,而不调用run方法,这里两者有什么区别呢
首先线程的状态有五种:创建、就绪、运行、阻塞和死亡
当调用start函数,线程的状态就处于就绪状态,处于就绪状态后,还需要等待CPU分配时间片
如果分到时间片,就进入运行状态,执行run函数

start() --> 启动线程,这个函数只能在一个线程中调用一次,如果超过一次则会抛出RuntimeError异常,它安排run()方法在另一个线程中调用

run() -->  用以表示线程活动的方法,你可以在子线程中覆盖此方法

import threading
class MyThread(threading.Thread):
def __init__(self,sid):
threading.Thread.__init__(self)
self.sid = sid
def run(self):
currentTreadname = threading.currentThread()
print("running in", currentTreadname) t = MyThread(1)
t.start()
t.run()

输出结果:

running in <MyThread(Thread-1, started 4948)>
running in <_MainThread(MainThread, started 5276)>

可以看到调用start方法是在创建的子线程中调用,而直接调用run方法则是在主线程中调用

Python线程创建与使用的更多相关文章

  1. python 线程创建和传参(28)

    在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程. 有了单线程的话,什么又是多线程? ...

  2. python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)

    ###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位    线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...

  3. python线程——创建和启动

    可以通过实例化一个threading.Thread()对象来创建子线程. import threading import time def listen_music(num): print(" ...

  4. python线程条件变量Condition(31)

    对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...

  5. python线程定时器Timer(32)

    相对前面几篇python线程内容而言,本片内容相对比较简单,定时器 – 顾名思义,必然用于定时任务. 一.线程定时器Timer原理 原理比较简单,指定时间间隔后启动线程!适用场景:完成定时任务,例如: ...

  6. python线程事件Event(30)

    在python项目开发中,线程thread使用是比较常见的,在前面的文章中我们介绍了 python线程的创建 以及 线程互斥锁 ,今天还要额外介绍一个与线程相关的内容 – 事件Event. 一.pyt ...

  7. python线程互斥锁Lock(29)

    在前一篇文章 python线程创建和传参 中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题, ...

  8. python——线程与多线程进阶

    之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...

  9. [python] 线程简介

    参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...

随机推荐

  1. node+mongoDB+express项目需求解释

    1. morgon模块 --- morgon 用于打印日志,分别为向后台打印和向文件中打印两种情况.stackoverflow. 2. app.use(bodyParser.json()) 3. de ...

  2. redis4集群

    三台服务器:先设置hosts 10.0.0.231 node1 10.0.0.232 node2 10.0.0.233 node3 端口分配: node1: node1: node2: node2: ...

  3. pat1080. Graduate Admission (30)

    1080. Graduate Admission (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  4. 【转载】CSS3 常用四个动画(旋转、放大、旋转放大、移动)

    http://blog.csdn.net/fungleo/article/details/49848905

  5. Aspose.Words导出图片 表格 Interop.Word

    先定义一个WORD 模板, 然后替换文本.域 ,定位开始表格 文本和段落 // Specify font formatting Aspose.Words.Font font = builder.Fon ...

  6. C#之Clone

    因为类的实例是引用类型,要想用原有的类中的实例的数据的话,既要想创建原对象的一个副本的话,只能用clone方法. Clone方法分为深clone和浅clone 在C#中提供了浅clone的方法,即为M ...

  7. iOS UIWebView 和 WKWebView 的 cookie 获取,设置,删除

    Cookie简介说到Cookie,或许有些小伙伴会比较陌生,有些小伙伴会比较熟悉.如果项目中,所有页面都是纯原生来实现的话,一般Cookie这个东西或许我们永远也不会接触到.但是,这里还是要说一下Co ...

  8. Redis入门--(一)简介NoSQL

    1.什么是NoSql? 2.为什么需要NoSQL? 互联网经历了1.0和2.0的发展: web1.0 是早期新浪,雅虎等只能浏览,不能交互: 传统关系型数据库在应付web2.0这种动态网站的时候力不从 ...

  9. 【起航计划 023】2015 起航计划 Android APIDemo的魔鬼步伐 22 App->Menu->Inflate from XML 使用xml资源展示菜单

    本例MenuInflateFromXml.java演示了如何从Menu 资源(XML 定义)展开菜单项.这个例子的onCreate 采用了使用代码来创建Activity 界面的方法 而通常的方法是采用 ...

  10. pcp分布式监控工具

    已经集成在redhat6.x版本里 http://pcp.io