VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • python基础教程之Python 多线程(2)

复制代码

 


线程优先级队列( Queue)

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

Queue模块中的常用方法:

 

实例(Python 2.0+)

复制代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import Queue
import threading
import time
 
exitFlag = 0
 
class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
    def run(self):
        print "Starting " + self.name
        process_data(self.name, self.q)
        print "Exiting " + self.name
 
def process_data(threadName, q):
    while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
        else:
            queueLock.release()
        time.sleep(1)
 
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1
 
# 创建新线程
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1
 
# 填充队列
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()
 
# 等待队列清空
while not workQueue.empty():
    pass
 
# 通知线程是时候退出
exitFlag = 1
 
# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"
复制代码

 

以上程序执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

  

1 篇笔记写笔记

  1. #1

       zhoushixiong

      men***nyuan@outlook.com

    Python 线程同步

    以下代码可以直观展示加锁和不加锁时,对数据修改情况。

    加锁时

    复制代码
    # -*-* encoding:UTF-8 -*-
    # author : shoushixiong
    # date   : 2018/11/22
    import threading
    import time
    list = [0,0,0,0,0,0,0,0,0,0,0,0]
    class myThread(threading.Thread):
        def __init__(self,threadId,name,counter):
            threading.Thread.__init__(self)
            self.threadId = threadId
            self.name = name
            self.counter = counter
        def run(self):
            print "开始线程:",self.name
            # 获得锁,成功获得锁定后返回 True
            # 可选的timeout参数不填时将一直阻塞直到获得锁定
            # 否则超时后将返回 False
            threadLock.acquire()
            print_time(self.name,self.counter,list.__len__())
            # 释放锁
            threadLock.release()
        def __del__(self):
            print self.name,"线程结束!"
    def print_time(threadName,delay,counter):
        while counter:
            time.sleep(delay)
            list[counter-1] += 1
            print "[%s] %s 修改第 %d 个值,修改后值为:%d" % (time.ctime(time.time()),threadName,counter,list[counter-1])
            counter -= 1
    threadLock = threading.Lock()
    threads = []
    # 创建新线程
    thread1 = myThread(1,"Thread-1",1)
    thread2 = myThread(2,"Thread-2",2)
    # 开启新线程
    thread1.start()
    thread2.start()
    # 添加线程到线程列表
    threads.append(thread1)
    threads.append(thread2)
    # 等待所有线程完成
    for t in threads:
        t.join()
    print "主进程结束!"
    复制代码

     

     

    输出结果为:

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    开始线程: Thread-1
    开始线程: Thread-2
    [Thu Nov 22 16:04:13 2018] Thread-1 修改第 12 个值,修改后值为:1
    [Thu Nov 22 16:04:14 2018] Thread-1 修改第 11 个值,修改后值为:1
    [Thu Nov 22 16:04:15 2018] Thread-1 修改第 10 个值,修改后值为:1
    [Thu Nov 22 16:04:16 2018] Thread-1 修改第 9 个值,修改后值为:1
    [Thu Nov 22 16:04:17 2018] Thread-1 修改第 8 个值,修改后值为:1
    [Thu Nov 22 16:04:18 2018] Thread-1 修改第 7 个值,修改后值为:1
    [Thu Nov 22 16:04:19 2018] Thread-1 修改第 6 个值,修改后值为:1
    [Thu Nov 22 16:04:20 2018] Thread-1 修改第 5 个值,修改后值为:1
    [Thu Nov 22 16:04:21 2018] Thread-1 修改第 4 个值,修改后值为:1
    [Thu Nov 22 16:04:22 2018] Thread-1 修改第 3 个值,修改后值为:1
    [Thu Nov 22 16:04:23 2018] Thread-1 修改第 2 个值,修改后值为:1
    [Thu Nov 22 16:04:24 2018] Thread-1 修改第 1 个值,修改后值为:1
    [Thu Nov 22 16:04:26 2018] Thread-2 修改第 12 个值,修改后值为:2
    [Thu Nov 22 16:04:28 2018] Thread-2 修改第 11 个值,修改后值为:2
    [Thu Nov 22 16:04:30 2018] Thread-2 修改第 10 个值,修改后值为:2
    [Thu Nov 22 16:04:32 2018] Thread-2 修改第 9 个值,修改后值为:2
    [Thu Nov 22 16:04:34 2018] Thread-2 修改第 8 个值,修改后值为:2
    [Thu Nov 22 16:04:36 2018] Thread-2 修改第 7 个值,修改后值为:2
    [Thu Nov 22 16:04:38 2018] Thread-2 修改第 6 个值,修改后值为:2
    [Thu Nov 22 16:04:40 2018] Thread-2 修改第 5 个值,修改后值为:2
    [Thu Nov 22 16:04:42 2018] Thread-2 修改第 4 个值,修改后值为:2
    [Thu Nov 22 16:04:44 2018] Thread-2 修改第 3 个值,修改后值为:2
    [Thu Nov 22 16:04:46 2018] Thread-2 修改第 2 个值,修改后值为:2
    [Thu Nov 22 16:04:48 2018] Thread-2 修改第 1 个值,修改后值为:2
    主进程结束!
    Thread-1 线程结束!
    Thread-2 线程结束!
  2. nodejs爬虫
  3. Python正则表达式完全指南
  4. 爬取豆瓣Top250图书数据
  5. shp 地图文件批量添加字段
  6. 爬虫小试牛刀(爬取学校通知公告)
  7. 【python基础】函数-初识函数
  8. 【python基础】函数-返回值
  9. HTTP请求:requests模块基础使用必知必会
  10. Python初学者友好丨详解参数传递类型
  11. 如何有效管理爬虫流量?
  12. SQL SERVER中递归
  13. 2个场景实例讲解GaussDB(DWS)基表统计信息估
  14. 常用的 SQL Server 关键字及其含义
  15. 动手分析SQL Server中的事务中使用的锁
  16. openGauss内核分析:SQL by pass & 经典执行
  17. 一招教你如何高效批量导入与更新数据
  18. 天天写SQL,这些神奇的特性你知道吗?
  19. openGauss内核分析:执行计划生成
  20. [IM002]Navicat ODBC驱动器管理器 未发现数据
  21. 初入Sql Server 之 存储过程的简单使用
  22. 这是目前我见过最好的跨域解决方案!
  23. 减少回流与重绘
  24. 减少回流与重绘
  25. 如何使用KrpanoToolJS在浏览器切图
  26. performance.now() 与 Date.now() 对比
  27. 一款纯 JS 实现的轻量化图片编辑器
  28. 关于开发 VS Code 插件遇到的 workbench.scm.
  29. 前端设计模式——观察者模式
  30. 前端设计模式——中介者模式
  31. 创建型-原型模式

相关教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号