Python threading多线程编程示例

Python 的多线程有两种实现方法: 函数,线程类 1.函数 调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么

# -*- coding: utf-8 -*-
import thread
def f(name):
  #定义线程函数
  print "this is " + name

if __name__ == ‘__main__‘:
  thread.start_new_thread(f, ("thread1",))
  #用start_new_thread()调用线程函数和其他参数
  while 1:
    pass

不过这种方法暂时没能找到其他辅助方法,连主线程等待都要用 while 1 这种方法解决。 2.线程类 调用 threading 模块,创建 threading.Thread 的子类来得到自定义线程类。

# -*- coding: utf-8 -*-
import threading
class Th(threading.Thread):
  def __init__(self, name):
    threading.Thread.__init__(self)
    self.t_name = name
    #调用父类构造函数

  def run(self):
    #重写run()函数,线程默认从此函数开始执行
    print "This is " + self.t_name

if __name__ == ‘__main__‘:
  thread1 = Th("Thread_1")
  thread1.start()
  #start()函数启动线程,自动执行run()函数

threading.Thread 类的可继承函数: getName() 获得线程对象名称 setName() 设置线程对象名称 join() 等待调用的线程结束后再运行之后的命令 setDaemon(bool) 阻塞模式, True: 父线程不等待子线程结束, False 等待,默认为 False isDaemon() 判断子线程是否和父线程一起结束,即 setDaemon() 设置的值 isAlive() 判断线程是否在运行 实例

import threading
import time
class Th(threading.Thread):
  def __init__(self, thread_name):
    threading.Thread.__init__(self)
    self.setName(thread_name)

  def run(self):
    print "This is thread " + self.getName()
    for i in range(5):
      time.sleep(1)
      print str(i)
    print self.getName() + "is over"

join() 阻塞等待

if __name__ == ‘__main__‘:
    thread1 = Th("T1 ")
    thread1.start()
    #thread1.join()
    print "main thread is over"

不带 thread1.join() ,得到如下结果: This is thread T1 main thread is over 0 1 2 T1 is over 不等待 thread1 完成,执行之后语句。 加了 thread1.join() ,得到如下结果: This is thread T1 0 1 2 T1 is over main thread is over 阻塞等待 thread1 结束,才执行下面语句 主线程等待

if __name__ == ‘__main__‘:
  thread1 = Th("T1 ")
  thread1.setDaemon(True)
  #要在线程执行之前就设置这个量
  thread1.start()
  print "main thread is over"

报错: Exception in thread T1 (most likely raised during interpreter shutdown): 也就是主线程不等待子线程就结束了。 多个子线程

if __name__ == ‘__main__‘:
    for i in range(3):
        t = Th(str(i))
        t.start()
    print "main thread is over"

这里的 t 可同时处理多个线程,即 t 为线程句柄,重新赋值不影响线程。 这里奇怪的是,运行 t.run() 时,不会再执行其他线程。虽不明,还是用 start() 吧。暂且理解为 start() 是非阻塞并行的,而 run 是阻塞的。 线程锁 threading 提供线程锁,可以实现线程同步。

import threading
import time
class Th(threading.Thread):
  def __init__(self, thread_name):
    threading.Thread.__init__(self)
    self.setName(thread_name)

  def run(self):
    threadLock.acquire()
    #获得锁之后再运行
    print "This is thread " + self.getName()
    for i in range(3):
      time.sleep(1)
      print str(i)
    print self.getName() + " is over"
    threadLock.release()
    #释放锁
if __name__ == ‘__main__‘:
  threadLock = threading.Lock()
  #设置全局锁
  thread1 = Th(‘Thread_1‘)
  thread2 = Th(‘Thread_2‘)
  thread1.start()
  thread2.start()

得到结果: This is thread Thread_1 0 1 2 Thread_1 is over This is thread Thread_2 0 1 2 Thread_2 is over 原文 http://blog.csdn.net/ice110956/article/details/28421807

时间: 2024-10-05 02:49:08

Python threading多线程编程示例的相关文章

【python】多线程编程

使用多线程编程和一个共享的数据结构如queue,这种程序任务可以用多个功能单一的线程来组织: UserRequestThread:负责读取客户的输入,可能是一个I/O信道.程序可能创建多个线程,每个客户一个,请求会被放入队列中 RequestProcessor:一个负责从队列中获取并处理请求的线程,它为下面那种线程提供输出 ReplyThread:负责把给用户的输出取出来,如果是网络应用程序就把结果发送出去,否则就保存到本地文件系统或数据库中. 一个顺序执行单线程的例子: from time i

Python的多线程编程

提到多线程,很多人就会望而却步,本文将由浅入深地带你攻克python多线程编程,并防止你跳入深坑, 首先看一段简单的代码: 1 from time import ctime,sleep 2 def play_video(video): 3 for i in range(2): 4 print "i am playing video: %s at %s"%(video,ctime()) 5 sleep(4) 6 7 8 def play_music(music): 9 for i in

多线程编程示例(结合实例)

1.CreateThread与_beginthreadex #pragma once #include<cstdio> #include<Windows.h> #include<crtdbg.h> #include<process.h> //子线程函数 DWORD WINAPI ThreadFun1(LPVOID pM) { printf("子线程的线程ID号为:%d\nHello world!\n",GetCurrentThreadId

多线程编程示例2(结合实例)

5.互斥量(Mutex) #pragma once #define _CRTDBG_MAP_ALLOC #include<cstdio> #include<Windows.h> #include<crtdbg.h> #include<process.h> unsigned int count = 0; const unsigned int threadnum = 50; HANDLE Mutex; CRITICAL_SECTION ThreadPar; un

多线程编程示例4(写者读者问题)

读者写者也是一个非常著名的同步问题. 读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件. #pragma once #define _CRTDBG_MAP_ALLOC #include<cstdio> #include<Windows.h> #include<crtdbg.h> #include<process.h> int currreadernum = 0;

python的多线程编程 --- thread模块

1.使用thread模块(不推荐) 常用函数: 'start_new_thread(function,args,kwargs=None)':创建一个新的线程,并运行'function(args)' 'allocate_lock()': 创建锁对象 Lock object 'exit()': 提示线程退出 Lock的函数: 'acquire(wait=None)': 获取lock对象或等待wait时间 'locked()' 获得lock返回true,否则返回false 'release' :释放l

18 多线程编程 - 《Python 核心编程》

?? 引言/动机 ?? 线程和进程 ?? 线程和 Python ?? thread 模块 ?? threading 模块 ?? 生产者-消费者问题和 Queue 模块 ?? 相关模块 18.1 引言/动机 18.2 线程和进程 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内 存中,被操作系统调用的时候才开始它们的生命期.进程(有时被称为重量级进程)是程序的一次 执行.每个进程都有自己的地址空间,内存,数据栈以及其它记录其运行轨迹的辅助数据.操作系

day-3 聊聊python多线程编程那些事

python一开始给我的印象是容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引我去深入学习.直到学习完多线程编程,在自己环境上验证完这句话:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运行,甚至比串行性能更差.不免有些落差,一开始就注定了这门语言迟早是有天花板的,对于一些并行要求高的系统,python可能不再成为首选,甚至是完全不考虑.但是事情也并不是绝对悲观的,我们已经看到有一大批人正在致力优化这个特性,新版本较老版本也有了一定改进,一些核心模块我们也可

python之多线程

声明:示例来源<python核心编程> 前言 单线程处理多个外部输入源的任务只能使用I/O多路复用,如:select,poll,epoll. 特别值得注意的是:由于一个串行程序需要从每个 I/O 终端通道来检查用户的输入,程序在读取 I/O 终端通道时不能阻塞,因为用户输入的到达时间是不确定的,并且阻塞会妨碍其他 I/O 通道的处理. select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责