在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常用模块用法分析
Sep 08 Python
Python使用metaclass实现Singleton模式的方法
May 05 Python
Python之用户输入的实例
Jun 22 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
python使用PyQt5的简单方法
Feb 27 Python
python实现视频分帧效果
May 31 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
Python docutils文档编译过程方法解析
Jun 23 Python
keras的三种模型实现与区别说明
Jul 03 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Matlab如何实现矩阵复制扩充
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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
一篇.NET面试题
2014/09/29 面试题
网页美工求职信
2014/02/15 职场文书
会计学自荐信
2014/06/03 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
会议通知
2015/04/15 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技