`
逸情公子
  • 浏览: 899496 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Python多线程学习

阅读更多

                                                            Python多线程学习
一.创建线程
1.通过thread模块中的start_new_thread(func,args)创建线程:
在Eclipse+pydev中敲出以下代码:

# -*- coding: utf-8 -*- 
import thread  
def run_thread(n):  
        for i in range(n):  
            print i  
  
thread.start_new_thread(run_thread,(4,)) #参数一定是元组,两个参数可以写成(a,b)

 

运行报错如下:

 

Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr

 

网上查出原因是不建议使用thread,然后我在pythonGUI中做了测试,测试结果如下,显然python是支持thread创建多线程的,在pydev中出错原因暂时不明。

 

>>> import thread
>>> def run(n):
	for i in range(n):
		print i

>>> thread.start_new_thread(run,(4,))
98520


1
>>> 
2
3

 

2.通过继承threading.Thread创建线程,以下示例创建了两个线程

# -*- coding: utf-8 -*- 
'''
Created on 2012-8-8

@author: jeromewei
 '''   
from threading import Thread
import time
class race(Thread):
    def __init__(self,threadname,interval):
        Thread.__init__(self,name=threadname)
        self.interval = interval
        self.isrunning = True
        
    
    def run(self):       #重写threading.Thread中的run()
        while self.isrunning:
            print 'thread %s is running,time:%s\n' %(self.getName(),time.ctime()) #获得线程的名称和当前时间
            time.sleep(self.interval)
    def stop(self):
        self.isrunning = False

def test():
    thread1 = race('A',1)
    thread2 = race('B',2)
    thread1.start()
    thread2.start()
    time.sleep(5)
    thread1.stop()
    thread2.stop()
    
if __name__ =='__main__':
    test()
 

3. 在threading.Thread中指定目标函数作为线程处理函数

# -*- coding: utf-8 -*- 
from threading import Thread  
def run_thread(n):  
        for i in range(n):  
            print i  
  
t1 = Thread(target=run_thread,args=(5,))#指定目标函数,传入参数,这里参数也是元组
t1.start()  #启动线程

 

二. threading.Thread中常用函数说明

 

       函数名
                                              功能
run() 如果采用方法2创建线程就需要重写该方法
getName() 获得线程的名称(方法2中有示例)
setName() 设置线程的名称
start() 启动线程
join(timeout)
在join()位置等待另一线程结束后再继续运行join()后的操作,timeout是可选项,表示最大等待时间
setDaemon(bool)
True:当父线程结束时,子线程立即结束;False:父线程等待子线程结束后才结束。默认为False
isDaemon() 判断子线程是否和父线程一起结束,即setDaemon()设置的值
isAlive()
判断线程是否在运行

 

以上方法中,我将对join()和setDaemon(bool)作着重介绍,示例如下:


(1)join方法:

# -*- coding: utf-8 -*- 
import threading  
import time     #导入time模块  
class Mythread(threading.Thread):  
    def __init__(self,threadname):  
        threading.Thread.__init__(self,name = threadname)  
    def run(self):  
        time.sleep(2) 
        for i in range(5):
            print '%s is running····'%self.getName()  
   
t2 = Mythread('B')  
t2.start()
#t2.join()     
for i in range(5):
    print 'the program is running···'

 

这时的程序流程是:主线程先运行完,然后等待B线程运行,所以输出结果为:

 

the program is running···
the program is running···
the program is running···
B is running····
B is running····
B is running····
 

如果启用t2.join() ,这时程序的运行流程是:当主线程运行到 t2.join() 时,它将等待 t2 运行完,然后再继续运行 t2.join() 后的操作,呵呵,你懂了吗,所以输出结果为:

 

B is running····
B is running····
B is running····
the program is running···
the program is running···
the program is running···

 

(2)setDaemon方法:

# -*- coding: utf-8 -*- 
import threading
import time 
class myThread(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)
        
    def run(self):
        time.sleep(5)
        print '%s is running·······done'%self.getName()
    
t=myThread('son thread')
#t.setDaemon(True)
t.start()
if t.isDaemon():
    print "the father thread and the son thread are done"
else:
    print "the father thread is waiting the son thread····"
 

这段代码的运行流程是:主线程打印完最后一句话后,等待son thread  运行完,然后程序才结束,所以输出结果为:

 

the father thread is waitting the son thread····
son thread is running·······done

 

如果启用t.setDaemon(True) ,这段代码的运行流程是:当主线程打印完最后一句话后,不管 son thread 是否运行完,程序立即结束,所以输出结果为:

 

the father thread and the son thread are done
 

三. 小结
介绍到这里,python多线程使用级别的知识点已全部介绍完了,下面我会分析一下python多线程的同步问题。

 

 

 

 

3
2
分享到:
评论
1 楼 风中之神 2014-12-23  
关于第一个运行报错“Unhandled exception in thread started by sys.excepthookmissing 
lost sys.stderr ” 是应为“python的主线程退出了,所以子线程启动不起来”,可以试着在后面加一行 “time.sleep(5)”就没问题了;

相关推荐

    python多线程Python多线程学习Python中的线程使用

    python,python多线程Python多线程学习Python中的线程使用python多线程Python多线程学习Python中的线程使用

    python多线程学习

    Python中的多线程是并发执行任务的一种方式,它允许程序同时处理多个任务,提升程序的效率。在Python中,我们通常使用`threading`模块来实现多线程,而不是`thread`模块,因为`threading`模块提供了更高级别的功能和...

    Python多线程学习教程

    同时,了解GIL(全局解释器锁)在Python中的作用,以及它如何限制了Python多线程在CPU密集型任务上的性能提升,也是深入学习的一部分。 在实际应用中,Python的多线程更适合于I/O密集型任务,因为GIL在多线程处理...

    Python多线程编程(6寸)[归纳].pdf

    Python多线程编程是利用Python实现程序并行性的一种方式,尤其适合于处理异步、并发事务和资源密集型任务。在多线程环境中,多个线程可以同时执行,提高程序效率,尤其对于那些需要从多个输入源处理数据或者进行大量...

    PYthon-multithreading-Test.rar_python_python 多线程_python多线程_多线程

    通过深入学习和实践压缩包中的“PYthon multithreading Test”源码,你可以更好地掌握Python多线程的原理和应用,为编写高效、稳定的多线程程序打下坚实的基础。在实际开发中,结合具体场景选择合适的并发模型,是...

    单线程与多线程python爬虫地图瓦片源码

    本文将深入探讨“单线程与多线程Python爬虫地图瓦片源码”的相关知识点。 首先,我们需要理解“线程”这一概念。线程是程序执行的最小单元,每个线程负责执行特定的任务。在单线程环境中,程序按顺序执行,一次只能...

    浅析Python多线程与多进程的使用

    在多线程编程中,我们需要注意全局解释器锁(GIL),它是Python解释器为了保证线程安全而引入的一个机制,但同时也限制了多线程在CPU密集型任务中的性能,因为GIL使得Python在同一时刻只能有一个线程在执行。...

    python多线程批量访问url脚本

    总的来说,这个"python多线程批量访问url脚本"提供了一个高效且易扩展的框架,用于批量处理HTTP请求,是学习Python网络编程和多线程处理的实用案例。通过理解和实践这个脚本,开发者不仅可以掌握多线程的基本概念,...

    完整版 Python高级开发课程 高级教程 08 Python多线程 多进程开发.pptx

    在Python高级开发中,多线程和多进程是两个重要的概念,它们被广泛应用于提高程序的并发性能,尤其是在处理大量数据或需要同时执行多个任务时。本课程将深入讲解这两个主题,帮助开发者提升Python应用程序的效率。 ...

    基于Linux的python多线程爬虫程序设计.zip

    最后,`基于Linux的python多线程爬虫程序设计.pdf`很可能包含详细的教程和示例代码,读者可以结合这份文档深入学习多线程爬虫的实现细节。通过实际项目练习,可以更好地理解和掌握这一技术,提升自己的编程能力。在...

    Python多线程编程详细示例

    这个是在学习python多线程的时候自己总结的文档,对理解Python多线程非常有帮助,很多都是从官方文档而来的。

    python多线程压缩包

    程序运行起来,叫进程,进程是资源分配的单位,线程执行代码,一个线程只能执行一个任务,想要执行多个任务,就需要多线程 协程依赖于线程,线程依赖于进程,协程切换需要资源相当少,所以效率就会很高 重构:把...

    第20章 Python多线程编程.pdf

    Python多线程编程是一种允许程序同时执行多...总的来说,Python多线程编程适合进阶型学习者,它要求开发者不仅要理解线程的工作原理,还要掌握如何正确使用`threading`模块提供的工具,实现高效且线程安全的程序设计。

    python 多线程编程

    通过分析和学习这个文件,你可以进一步加深对Python多线程编程的理解,包括如何有效地使用线程池(`ThreadPoolExecutor`),以及如何处理线程异常和线程间的协作问题。 总之,Python的多线程编程虽然受到GIL的限制...

    Python-python多线程函数库vthread简而强大

    "Python-python多线程函数库vthread简而强大"就是为了解决这一问题而诞生的。 vthread库是针对Python的一个增强型多线程库,它的主要目标是简化多线程和线程池的使用,提高开发效率。与Python标准库中的`threading`...

    python多线程

    Python多线程是指在Python编程语言中使用线程来执行多任务的技术。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。多线程编程是并发编程的一部分,其目的是为了提高程序的...

    python多线程-threading模块.pdf

    Python 多线程 - Threading 模块 Python 中的多线程编程是使用 Threading 模块实现的,该模块提供了丰富的功能来创建和管理线程。在学习 Threading 模块之前,需要了解 Python 的基础知识,包括函数、类、对象等...

    基于python的多线程例子,详细介绍了多线程处理

    总的来说,通过学习和应用Python的多线程技术,我们可以编写出更加高效、响应迅速的程序。不过,需要注意线程安全、同步机制和资源管理,以确保程序的稳定性和正确性。在实际开发中,根据任务的性质选择合适的并发...

    Python多线程示例

    在这个"Python多线程示例"中,我们主要关注如何在Python环境中创建和管理线程。核心知识点包括: 1. **线程模块**:Python的`threading`模块提供了线程相关的所有功能。`Thread`类是其核心,通过实例化这个类可以...

Global site tag (gtag.js) - Google Analytics