在Python中通过threading模块定义和调用线程的方法


Posted in Python onJuly 12, 2016

定义线程

最简单的方法:使用target指定线程要执行的目标函数,再使用start()启动。

语法:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

group恒为None,保留未来使用。target为要执行的函数名。name为线程名,默认为Thread-N,通常使用默认即可。但服务器端程序线程功能不同时,建议命名。

#!/usr/bin/env python3
# coding=utf-8
import threading

def function(i):
  print ("function called by thread {0}".format(i))
threads = []

for i in range(5):
  t = threading.Thread(target=function , args=(i,))
  threads.append(t)
  t.start()
  t.join()

执行结果:

$ ./threading_define.py
function called by thread 0
function called by thread 1
function called by thread 2
function called by thread 3
function called by thread 4

确定当前线程

#!/usr/bin/env python3
# coding=utf-8

import threading
import time

def first_function():
  print (threading.currentThread().getName()+ str(' is Starting \n'))
  time.sleep(3)
  print (threading.currentThread().getName()+ str( ' is Exiting \n'))
  
def second_function():
  print (threading.currentThread().getName()+ str(' is Starting \n'))
  time.sleep(2)
  print (threading.currentThread().getName()+ str( ' is Exiting \n'))
  
def third_function():
  print (threading.currentThread().getName()+\
  str(' is Starting \n'))
  time.sleep(1)
  print (threading.currentThread().getName()+ str( ' is Exiting \n'))
  
if __name__ == "__main__":
  t1 = threading.Thread(name='first_function', target=first_function)
  t2 = threading.Thread(name='second_function', target=second_function)
  t3 = threading.Thread(name='third_function',target=third_function)
  t1.start()
  t2.start()
  t3.start()

执行结果:

$ ./threading_name.py
first_function is Starting 
second_function is Starting 
third_function is Starting 
third_function is Exiting 
second_function is Exiting 
first_function is Exiting

配合logging模块一起使用:

#!/usr/bin/env python3
# coding=utf-8

import logging
import threading
import time

logging.basicConfig(
  level=logging.DEBUG,
  format='[%(levelname)s] (%(threadName)-10s) %(message)s',
  )
  
def worker():
  logging.debug('Starting')
  time.sleep(2)
  logging.debug('Exiting')
  
def my_service():
  logging.debug('Starting')
  time.sleep(3)
  logging.debug('Exiting')
  
t = threading.Thread(name='my_service', target=my_service)
w = threading.Thread(name='worker', target=worker)
w2 = threading.Thread(target=worker) # use default name
w.start()
w2.start()
t.start()

执行结果:

$ ./threading_names_log.py[DEBUG] (worker  ) Starting
[DEBUG] (Thread-1 ) Starting
[DEBUG] (my_service) Starting
[DEBUG] (worker  ) Exiting
[DEBUG] (Thread-1 ) Exiting
[DEBUG] (my_service) Exiting

在子类中使用线程

前面我们的线程都是结构化编程的形式来创建。通过集成threading.Thread类也可以创建线程。Thread类首先完成一些基本上初始化,然后调用它的run()。run()方法会会调用传递给构造函数的目标函数。

#!/usr/bin/env python3
# coding=utf-8

import logging
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
  def __init__(self, threadID, name, counter):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.counter = counter
    
  def run(self):
    print ("Starting " + self.name)
    print_time(self.name, self.counter, 5)
    print ("Exiting " + self.name)
    
def print_time(threadName, delay, counter):
  while counter:
    if exitFlag:
      thread.exit()
    time.sleep(delay)
    print ("%s: %s" %(threadName, time.ctime(time.time())))
    counter -= 1
    
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print ("Exiting Main Thread")

执行结果:

$ ./threading_subclass.py
Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Tue Sep 15 11:03:21 2015
Thread-2: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:23 2015
Thread-2: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:25 2015
Exiting Thread-1
Thread-2: Tue Sep 15 11:03:26 2015
Thread-2: Tue Sep 15 11:03:28 2015
Thread-2: Tue Sep 15 11:03:30 2015
Exiting Thread-2
Python 相关文章推荐
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
pytorch进行上采样的种类实例
Feb 18 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Python3使用Selenium获取session和token方法详解
Feb 16 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 Python
举例讲解Python编程中对线程锁的使用
Jul 12 #Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 #Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 #Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 #Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 #Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 #Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 #Python
You might like
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
Python SQLite3简介
2018/02/22 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
一百多行python代码实现抢票助手
2018/09/25 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
秸秆管理实施方案
2014/03/15 职场文书
我的求职择业计划书
2014/04/04 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
工作会议通知
2015/04/15 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电