在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 threading模块操作多线程介绍
Apr 08 Python
python递归计算N!的方法
May 05 Python
解密Python中的描述符(descriptor)
Jun 03 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
在Pandas中处理NaN值的方法
Jun 25 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
关于Python解包知识点总结
May 05 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
详解Python中*args和**kwargs的使用
Apr 07 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
PHP4引用文件语句的对比
2006/10/09 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
python实现ip代理池功能示例
2019/07/05 Python
利用Python实现kNN算法的代码
2019/08/16 Python
python根据文本生成词云图代码实例
2019/11/15 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
机电专业体育教师求职信
2013/09/21 职场文书
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
社区志愿者心得体会
2014/01/03 职场文书
婚前协议书怎么写
2014/04/15 职场文书
人事主管岗位职责
2015/02/04 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
大学军训口号大全
2015/12/24 职场文书
python井字棋游戏实现人机对战
2022/04/28 Python