在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实现巡检系统(solaris)示例
Apr 02 Python
Python中的super用法详解
May 28 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
python去掉行尾的换行符方法
Jan 04 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
python实现键盘控制鼠标移动
Nov 27 Python
在双python下设置python3为默认的方法
Oct 31 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
Python设计模式之状态模式原理与用法详解
Jan 15 Python
python批量修改ssh密码的实现
Aug 08 Python
Python拼接字符串的7种方式详解
Mar 19 Python
详解python datetime模块
Aug 17 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
COM in PHP (winows only)
2006/10/09 PHP
PHP实现文件下载详解
2014/11/27 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
js数组去重的hash方法
2016/12/22 Javascript
详解angular element()方法使用
2017/04/08 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
MySQL适配器PyMySQL详解
2017/09/20 Python
python实现机器人行走效果
2018/01/29 Python
python如何删除文件中重复的字段
2019/07/16 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
经典演讲稿范文
2013/12/30 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
化工专业求职信
2014/07/01 职场文书
初三英语教学计划
2015/01/23 职场文书
大国崛起英国观后感
2015/06/02 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL