文档章节

Python多线程介绍

素人派
 素人派
发布于 2016/12/31 20:47
字数 699
阅读 8
收藏 0
  • 介绍
在Python的开发过程中,有时候会用到多线程的技术,例如在开发服务端程序时就不可避免的要使用多线程。 thread是相对低级的线程模块,threading是经过封装的功能比较强。
  • 最简单的一个多线程例子
[codesyntax lang="python"]
__author__ = 'suren'

import thread
import time

def task():
        print(1)
        pass

thread.start_new_thread(task, ()) 
thread.start_new_thread(task, ()) 

time.sleep(3)
[/codesyntax] 线程模块thread中启动线程的函数,需要至少两个参数:函数名、函数的参数列表。
  • 继承线程类
[codesyntax lang="python"]
__author__ = 'suren'

import threading
import time

class Task(threading.Thread):
        def __init__(self):
                threading.Thread.__init__(self)
                pass

        def run(self):
                print('task thread started.')
                pass

thread1 = Task()
thread2 = Task()

thread1.start()
thread2.start()

time.sleep(3)
[/codesyntax] threading.Thread类中包含的函数有: run(),线程启动时调用的代码 getName(),获取线程对象名称 setName(),设置线程对象名称 start(),启动线程的函数 join([timeout]),等待另一个线程运行结束后在调用 setDaemon(bool),设置子线程是否随着主线程一起结束,必须在start之前调用 isDaemon(),检查是否为守护线程 isAlive(),检查线程是否还在运行中
  • 简单线程锁
[codesyntax lang="python"]
__author__ = 'suren'

import thread
import time

suren_lock = thread.allocate_lock()
num = 0

def task():
        global num
        while True:
                try:
                        suren_lock.acquire()

                        num += 1
                        time.sleep(0.1)

                        print('task running : %d' % (num))
                finally:
                        suren_lock.release()
                        pass

thread.start_new_thread(task, ())
thread.start_new_thread(task, ())
thread.start_new_thread(task, ())
thread.start_new_thread(task, ())
thread.start_new_thread(task, ())

time.sleep(1)
[/codesyntax] 上面的代码中,如果把获取、释放锁的行注释掉再运行的话,你会发现每次打印出的内容都是不一样的。
  • 高级线程锁
[codesyntax lang="python"]
__author__ = 'suren'

import threading
import time

suren_lock = threading.RLock()
num = 0

class Task(threading.Thread):
        def __init__(self):
                threading.Thread.__init__(self)
                pass

        def run(self):
                global num

                while True:
                        try:
                                suren_lock.acquire()

                                num += 1
                                time.sleep(0.1)

                                print('task running : %d' % (num))
                                pass
                        finally:
                                suren_lock.release()
                                pass
                pass

thread1 = Task()
thread2 = Task()
thread3 = Task()
thread4 = Task()
thread5 = Task()

thread1.start()
thread2.start()
thread3.start()
thread4.start()
thread5.start()

time.sleep(1)
[/codesyntax] 同样地,要是把上面代码中获取、释放锁的行注释掉的话,打印出来的内容是乱的。
  • 条件同步
[codesyntax lang="python"]
__author__ = 'suren'

import threading
import time

condition = threading.Condition()
num = 0

class Producer(threading.Thread):
        def __init__(self):
                global num

                while True:
                        try:
                                if num > 0:
                                        condition.wait()
                                else:
                                        time.sleep(0.1)

                                pass
                        finally:
                                condition.release()
                                pass
                pass

class Consumer(threading.Thread):
        def __init__(self):
                threading.Thread.__init__(self)
                pass
        
        def run(self):
                global num

                while True:
                        try:
                                condition.acquire()
                                
                                if num <= 0:
                                        condition.wait()
                                else:
                                        print('num : %d' % (num))
                                        num -= 1
                                        condition.notify()
                                        time.sleep(0.3)

                                pass
                        finally:
                                condition.release()
                                pass
                pass

producer1 = Producer()
consumer1 = Consumer()
consumer2 = Consumer()
consumer3 = Consumer()
consumer4 = Consumer()

producer1.start()
consumer1.start()
consumer2.start()
consumer3.start()
consumer4.start()

time.sleep(1)
[/codesyntax]
  • 同步队列
[codesyntax lang="python"]
__author__ = 'suren'

import threading
import time
from Queue import Queue

class Producer(threading.Thread):
        def __init__(self, queue):
                threading.Thread.__init__(self)
                self.data = queue
                pass

        def run(self):
                while True:
                        self.data.put(1)
                        time.sleep(0.1)
                pass

class Consumer(threading.Thread):
        def __init__(self, queue):
                threading.Thread.__init__(self)
                self.data = queue
                pass
        
        def run(self):
                while True:
                        self.data.get()
                        print(self.data.qsize())
                pass
 
queue = Queue()
producer1 = Producer(queue)
producer2 = Producer(queue)
producer3 = Producer(queue)
producer4 = Producer(queue)
consumer = Consumer(queue)

producer1.start()
producer2.start()
producer3.start()
producer4.start()
consumer.start()

time.sleep(1)
[/codesyntax]
  • 参考
http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html www.python.org/doc/2.5.2/lib/module-threading.html

本文转载自:http://surenpi.com/2015/04/14/python%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%bb%8b%e7%bb%8d/

共有 人打赏支持
上一篇: ExtJs杂记
下一篇: 2005年GCT真题
素人派
粉丝 22
博文 1906
码字总数 9279
作品 6
东城
程序员
私信 提问

暂无文章

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部