文档章节

Python多线程介绍

素人派
 素人派
发布于 2015/07/22 07:56
字数 699
阅读 63
收藏 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/

上一篇: aria2
下一篇: 2005年GCT真题
素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
(转载)Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎 https://zhuanlan.zhihu.com/p/24283040 Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线...

avatus
2018/09/05
0
0
最新阿里巴巴面试题(附带面试标准答案)

在上一节中,我们已经介绍了关于阿里巴巴的任职要求,这节我就详细的介绍一下关于阿里巴巴的面试题(涉及到标准代码部分不予以出现,如果想要可以加群:725479218,里面可以进行技术分享、技术...

柯西带你学编程
2018/06/02
0
0
Python RPC 远程调用脚本之 RPyC 实践

最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆节点主机,要求只需要调用远程脚本模块的方法就能实现。 总结下python进行远程调...

大数据之路
2015/06/28
0
0
买《Python从小白到大牛》专题视频课程,送配套纸质图书

经过一年多时间的呕心沥血,Python立体化图书——《Python从小白到大牛》即将与大家见面了。所谓立体化图书包括:电子图书、视频、课件和服务等内容。 《Python从小白到大牛》纸质图书将于9...

tony关东升
2018/07/23
0
0
Python标准库08 多线程与同步 (threading包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! Python主要通过标准库中的threading包来实现多线程。在当今网络时代,每个服务器都会接收到大量的请求...

osDaniel
2014/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mac搭建mysql环境

这里记录一下mac中搭建mysql中环境的过程,主要记录一下操作,以便日后再次安装。 进入mysql官方网站下载dmg包,解压,安装,生成数据库登录密码。 在bash_profile中加入PATH=$PATH:/usr/loc...

JerryLin123
16分钟前
0
0
以太坊如何计算交易成本

在发送比特币交易时,其费用与其大小成比例。输入和输出越多,它就越贵。再加上未决交易的因素,交易费用可能仅基于这两个因素就会飙升。 对于以太坊,鉴于我们正在谈论协议中的编程语言,对...

笔阁
24分钟前
0
0
java修饰符的一些问题

作者总结的好 http://www.cnblogs.com/lixiaolun/p/4311727.html

南桥北木
26分钟前
0
0
Fabric-sdk-java链码访问快速上手【无痛】

在超级账本Fabric区块链中,应用通过节点的RPC协议接口访问链码。Java应用可以使用官方提供的Fabric-sdk-java开发包来实现对链码的访问,开发包封装了Fabric区块链的GRPC链码访问协议,有利于...

geek12345
28分钟前
0
0
python setup.py egg_info" failed with error code 1 in /tmp/pip-install-fwot3_uw/mysqlclient/

解决方法: yum install python-devel yum install mysql-devel yum install gcc

MedivhXu
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部