在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实现baidu hi自动登录的代码
Feb 10 Python
通过C++学习Python
Jan 20 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
python先序遍历二叉树问题
Nov 10 Python
python requests.post带head和body的实例
Jan 02 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
python getpass模块用法及实例详解
Oct 07 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
python 数据库查询返回list或tuple实例
May 15 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
python关于集合的知识案例详解
May 30 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仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
javascript事件模型代码
2007/07/01 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
Python threading多线程编程实例
2014/09/18 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
python中int与str互转方法
2018/07/02 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
python 怎样进行内存管理
2020/11/10 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
关于九一八事变的演讲稿2014
2014/09/17 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS