在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 相关文章推荐
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
获取python文件扩展名和文件名方法
Feb 02 Python
浅谈Python中的私有变量
Feb 28 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
解析python的局部变量和全局变量
Aug 15 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 Python
Python采集股票数据并制作可视化柱状图
Apr 04 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
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
JavaScript 中的六种循环方法
2021/01/06 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
一些PHP的面试题
2015/05/06 面试题
幼儿园教师个人反思
2014/01/30 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
运动员加油词
2015/07/18 职场文书
旅行社计调工作总结
2015/08/12 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL
Nginx的gzip相关介绍
2022/05/11 Servers