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. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

  2. Nginx + Keepalived 实例(测试可行)

    Nginx_Master: 192.168.1.103 提供负载均衡 Nginx_BackUp: 192.168.1.104 负载均衡备机 Nginx_VIP_TP: 192.168.1.108 网站 ...

  3. Makefile2

    规范 target可以是Object file, 可执行文件或者标签(标签一般没有依赖) 越靠近最终结果的target卸载越前面 定义target前, 定义CC, SRC, CFLAGS, OBJS, ...

  4. 上传文件,使用FormData进行Ajax请求,jsoncallback跨域

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  5. java环境下wsimport编译Wsdl

    使用命令提示符进行操作:首先CD至java jdk/bin目录下.先bin目录下执行以下命令即可: -----------------------------服务需求放置的位置------------ ...

  6. [LeetCode]11. Container With Most Water 盛最多水的容器

    Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...

  7. 基于nodejs的DNS查询工具

    开始这个实例之前,我们简单谈一下Node.js吧,Node.js是一个由JavaScript书写而成的强大Web开发框架,它让开发强壮的.伸缩性良好的服务器端Web应用变得更加简单.容易.这种技术诞生 ...

  8. VueJs组件prop验证简单理解

    今天看了vuejs的组件,看到了prop组件,主要作用是在传入数据的时候对传入的值做判断,写了个小例子. <div id="app"> <my-child :nu ...

  9. 【技巧】如何使用UltraEdit删掉某些行并且不留空行

    例: 在S1这个文件中我想要把所有B6 96 FD 2E 49 96 2 D2的行删掉. 首先,查找这些序列,执行替换命令,替换为的内容不写. 点击“全部替换”之后,发现在原来的位置多了一行空行. 接 ...

  10. centos部署vue项目

    参考链接 nodejs服务器部署教程二,把vue项目部署到线上 打包 #在本地使用以下命令,打包 npm run build #打包之后本地会出现dist文件夹.将dist文件夹以及package.j ...