在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 (1)
Oct 31 Python
在Python中使用模块的教程
Apr 27 Python
Python3中的2to3转换工具使用示例
Jun 12 Python
python实现逻辑回归的方法示例
May 02 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
python保存数据到本地文件的方法
Jun 23 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
python面向对象法实现图书管理系统
Apr 19 Python
python中使用while循环的实例
Aug 05 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Python 解决空列表.append() 输出为None的问题
May 23 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
人大复印资料处理程序_查询篇
2006/10/09 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
wxPython实现分隔窗口
2019/11/19 Python
三个python爬虫项目实例代码
2019/12/28 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
python 等差数列末项计算方式
2020/05/03 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
绿色城市实施方案
2014/03/19 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
骨干教师申报材料
2014/12/17 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
Redis基本数据类型List常用操作命令
2022/06/01 Redis