在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控制台英汉汉英电子词典
Apr 23 Python
python采集博客中上传的QQ截图文件
Jul 18 Python
在Python中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
对python3 sort sorted 函数的应用详解
Jun 27 Python
python重要函数eval多种用法解析
Jan 14 Python
简单了解Python write writelines区别
Feb 27 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
Python NumPy灰度图像的压缩原理讲解
Aug 04 Python
Python中的tkinter库简单案例详解
Jan 22 Python
Python+DeOldify实现老照片上色功能
Jun 21 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
FCKeditor的安装(PHP)
2007/01/13 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
php实现图片缩略图的方法
2016/03/29 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
js 幻灯片的实现
2011/12/06 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
python查看zip包中文件及大小的方法
2015/07/09 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
django批量导入xml数据
2016/10/16 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
python图像和办公文档处理总结
2019/05/28 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
大学生党课感想
2015/08/11 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
python如何做代码性能分析
2021/04/26 Python
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL