在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 相关文章推荐
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
Python实现将绝对URL替换成相对URL的方法
Jun 28 Python
快速入手Python字符编码
Aug 03 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
Python闭包函数定义与用法分析
Jul 20 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
解决python对齐错误的方法
Jul 16 Python
Django Form常用功能及代码示例
Oct 13 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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的五种设计模式
2012/09/05 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
php实现微信企业转账功能
2018/10/02 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
JS 显示当前日期与时间的代码
2010/03/24 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
python属于跨平台语言码
2020/06/09 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
英国电信商店:BT Shop
2019/12/17 全球购物
策划助理岗位职责
2013/11/18 职场文书
大学生学业生涯规划
2014/01/05 职场文书
工作鉴定评语
2014/05/04 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
社会实践活动总结范文
2014/07/03 职场文书
投标承诺函范文
2015/01/21 职场文书
爱心助学感谢信
2015/01/21 职场文书
施工安全保证书
2015/05/09 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS