在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写的图片蜘蛛人代码
Aug 27 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
python避免死锁方法实例分析
Jun 04 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python3对接mysql数据库实例详解
Apr 30 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
Python中实现输入一个整数的案例
May 03 Python
Pytorch DataLoader shuffle验证方式
Jun 02 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开发中的安全防范知识详解
2013/06/06 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
php表单处理操作
2017/11/16 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
浅析python协程相关概念
2018/01/20 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
测绘工程个人的自我评价
2013/11/23 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
高三毕业寄语
2014/04/10 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
Python合并多张图片成PDF
2021/06/09 Python