Python中多线程的创建及基本调用方法_python

1. 多线程的作用
简而言之,多线程是并行处理相互独立的子任务,从而大幅度提高整个任务的效率。

2. Python中的多线程相关模块和方法
Python中提供几个用于多线程编程的模块,包括thread,threading和Queue等
thread模块提供了基本的线程和锁的支持,除产生线程外,也提供基本的同步数据结构锁对象,其中包括:
start_new_thread(function, args kwargs=None)  产生一个新的线程来运行给定函数
allocate_lock()  分配一个LockType类型的锁对象
exit() 让线程退出
acquire(wait=None) 尝试获取锁对象
locked()  如果获取了锁对象返回TRUE,否则返回FALSE
release()  释放锁
threading提供了更高级别,功能更强的线程管理功能
Thread类 表示一个线程的执行的对象
Lock 锁原语对象
RLock 可重入锁对象,使单线程可以再次获得已经获取锁
queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构
可用于进程间的通讯,让各个线程之间共享数据
模块函数queue(size)  创建一个大小为size的Queue对象
queue对象函数 qsize()  返回队列大小
empty()  队列为空返回True,否则返回False
put(item, block=0)  把ITEM放到队列中,block不为0,函数会一直阻塞到队列中
get(block=0) 从队列中取一个对象,若果给block,函数会一直阻塞到队列中有对象为止

3.示例
目前Python的lib中对多线程编程提供两种启动方法,一种是比较基本的thread模块中start_new_thread方法,在线程中运行一个函数, 另一种是使用集成threading模块的线程对象Thread类。
目前所用到的,是旧版本中调用thread模块中的start_new_thread()函数来产生新的线程
相比而言,thread.start_new_thread(function,(args[,kwargs]))实现机制其实与C更为类似,其中function参数是将要调用的线程函数;(args[,kwargs])是将传递给待创建线程函数的参数组成的元组类型,其中kwargs是可选的参数。新创建的线程结束一般依靠线程函数的执行结束自动退出,或者在线程函数中调用thread.exit()抛出SystemExit exception,达到线程退出的目的。

print "=======================thread.start_new_thread启动线程============="
import thread
#Python的线程sleep方法并不是在thread模块中,反而是在time模块下
import time
def inthread(no,interval):
  count=0
  while count<10:
    print "Thread-%d,休眠间隔:%d,current Time:%s"%(no,interval,time.ctime())
    #使当前线程休眠指定时间,interval为浮点型的秒数,不同于Java中的整形毫秒数
    time.sleep(interval)
    #Python不像大多数高级语言一样支持++操作符,只能用+=实现
    count+=1
  else:
    print "Thread-%d is over"%no
    #可以等待线程被PVM回收,或主动调用exit或exit_thread方法结束线程
    thread.exit_thread()
#使用start_new_thread函数可以简单的启动一个线程,第一个参数指定线程中执行的函数,第二个参数为元组型的传递给指定函数的参数值
thread.start_new_thread(inthread,(1,2))
  #线程执行时必须添加这一行,并且sleep的时间必须足够使线程结束,如本例
  #如果休眠时间改为20,将可能会抛出异常
time.sleep(30)
'''

使用这种方法启动线程时,有可能出现异常

Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:

解决:启动线程之后,须确保主线程等待所有子线程返回结果后再退出,如果主线程比子线程早结束,无论其子线程是否是后台线程,都将会中断,抛出这个异常
若没有响应阻塞等待,为避免主线程提前退出,必须调用time.sleep使主线程休眠足够长的时间,另外也可以采用加锁机制来避免类似情况,通过在启动线程的时候,给每个线程都加了一把锁,直到线程运行介绍,再释放这个锁。同时在Python的main线程中用一个while循环来不停的判断每个线程锁已释放。

import thread;
from time import sleep,ctime;
from random import choice
#The first param means the thread number
#The second param means how long it sleep
#The third param means the Lock
def loop(nloop,sec,lock):
  print "Thread ",nloop," start and will sleep ",sec;
  sleep(sec);
  print "Thread ",nloop," end ",sec;
  lock.release();  

def main():
  seconds=[4,2];
  locks=[];
  for i in range(len(seconds)) :
    lock=thread.allocate_lock();
    lock.acquire();
    locks.append(lock);  

  print "main Thread begins:",ctime();
  for i,lock in enumerate(locks):
    thread.start_new_thread(loop,(i,choice(seconds),lock));
  for lock in locks :
    while lock.locked() :
      pass;
  print "main Thread ends:",ctime();  

if __name__=="__main__" :
  main();  

很多介绍说在新python版本中推荐使用Threading模块,目前暂没有应用到。。。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
线程
c 多线程调用python、python 多线程调用、python 创建多线程、python 多线程、python 多线程并发,以便于您获取更多的相关知识。

时间: 2025-01-21 01:21:21

Python中多线程的创建及基本调用方法_python的相关文章

Python中多线程thread与threading的实现方法_python

学过Python的人应该都知道,Python是支持多线程的,并且是native的线程.本文主要是通过thread和threading这两个模块来实现多线程的. python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用. 这里需要提一下的是python对线程的支持还不够完善,不能利用多CPU,但是下个版本的python中已经考虑改进这点,让我们拭目以待吧. threading模块里面主要是对一些线程的操作对象化了,创建

python中readline判断文件读取结束的方法_python

本文实例讲述了python中readline判断文件读取结束的方法.分享给大家供大家参考.具体分析如下: 大家知道,python中按行读取文件可以使用readline函数,下面现介绍一个按行遍历读取文件的方法,通过这个方法,展开我们要讨论的问题: 复制代码 代码如下: filename = raw_input('Enter your file name')  #输入要遍历读取的文件路径及文件名 file = open(filename,'r') done = 0 while not  done:

Python中实现参数类型检查的简单方法_python

Python是一门弱类型语言,很多从C/C++转过来的朋友起初不是很适应.比如,在声明一个函数时,不能指定参数的类型.用C做类比,那就是所有参数都是void*类型!void类型强制转换在C++中被广泛地认为是个坏习惯,不到万不得已是不会使用的. Python自然没有类型强制转换一说了,因为它是动态语言.首先,所有对象都从Object继承而来,其次,它有强大的内省,如果调用某个不存在的方法会有异常抛出.大多数情况,我们都不需要做参数类型栓查,除了一些特殊情况.例如,某个函数接受一个str类型,结果

详解Python中列表和元祖的使用方法_python

list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> classmates = ['Michael', 'Bob', 'Tracy'] >>> classmates ['Michael', 'Bob', 'Tracy'] 变量classmates就是一个list.用len()函数可以获得list元素的个数: >>> len(c

python中stdout输出不缓存的设置方法_python

考虑以下python程序: 复制代码 代码如下: #!/usr/bin/env python import sys sys.stdout.write("stdout1 ")sys.stderr.write("stderr1 ")sys.stdout.write("stdout2 ")sys.stderr.write("stderr2 ") 其中的sys.stdout.write也可以换成print.运行这程序,你觉得会输出什么

Python中多线程及程序锁浅析_python

Python中多线程使用到Threading模块.Threading模块中用到的主要的类是Thread,我们先来写一个简单的多线程代码: 复制代码 代码如下: # coding : uft-8 __author__ = 'Phtih0n' import threading class MyThread(threading.Thread):     def __init__(self):         threading.Thread.__init__(self)     def run(sel

python中多线程的一个例子总是报错大家帮忙看看

问题描述 python中多线程的一个例子总是报错大家帮忙看看 解决方案 http://bbs.csdn.net/topics/390614709 解决方案二: ...找到原因了是t2里的args函数名没写对.............,还是谢谢各位了

Python中转换角度为弧度的radians()方法

  这篇文章主要介绍了Python中转换角度为弧度的radians()方法,是Python入门中的基础知识,需要的朋友可以参考下 radians()方法把角度转化为弧度角x. 语法 以下是radians()方法的语法: ? 1 radians(x) 注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math的静态对象来调用这个函数. 参数 x -- 这必须是一个数值. 返回值 此方法返回一个角度的弧度值. 例子 下面的示例演示radians()方法的使用. ? 1 2 3 4

介绍Python中的try和finally和with方法

  这篇文章主要介绍了Python中的try和finally和with方法,是Python学习当中的基础知识,需要的朋友可以参考下 用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要捕获所有异常, 输出一行警告并退出. 代码可能一开始看起来是这样的 ? 1 2 3 4 5 6 7 8 def read_file(): try: f = open('