《可爱的Python》读书笔记(九)

KISS 才是王道!

KISS == Keep It Simple,Stupid

不论什么,坚持简单的过程/原理/结构/代码,就是自在!

现在小白想使用多线程来提高查询的速度,就用threading模块了!

# -*- coding: utf-8 -*-
import os
import time
from threading import Thread
from configparser import RawConfigParser as rcp

class grepIt(Thread):

    def __init__(self, cdcfile, keyword):
    
        Thread.__init__(self)
        self.cdcf = cdcfile
        self.keyw = keyword.upper()
        self.report = ""
    def run(self):
    
        if self.cdcf.endswith('.ini'):
            self.report = marklni(self.cdcf, self.keyw)
            
            
def marklni(cdcfile, keyword):
    """配置文件模式匹配函数
    """
    report = ""
    keyw = keyword.upper()
    cfg = rcp()
    cfg.read(cdcfile)
    nodelist = cfg.sections()
    nodelist.remove("Comment")
    nodelist.remove("Info")
    for node in nodelist:
        if keyw in node.upper():
            print(node)
            report += "\n %s" % node
            continue
        else:
            for item in cfg.items(node):
                if keyw in item[0].upper():
                    report += "\n %s\%s" % (node, item)
    return report
    
def grepSearch(cdcpath, keyword):
    """多线程群体搜索函数
    """
    begin = time.time()
    filelist = os.listdir(cdcpath)
    # 用于记录发起的搜索线程
    searchlist = []
    for cdcf in filelist:
        pathcdcf = "%s\%s" % (cdcpath, cdcf)
        #print(pathcdcf)
        # 初始化线程对象
        current = grepIt(pathcdcf, keyword)
        # 追加记录线程队列
        searchlist.append(current)
        # 发动线程处理
        current.start()
    for searcher in searchlist:
        searcher.join()
        print("Search from", searcher.cdcf, "out", searcher.report)
    print("usage %s s" % (time.time() - begin))
    
    
if __name__ == "__main__":

    grepSearch("F:\\back", "images")

针对执行效率的重构,就像玩头脑急转弯,只要充分直觉地分析运行时的整体软件行为,很容易确定瓶颈。

对问题有了准确的理解后,再向行者请教时便有了确切方向,进而容易获得有效的提示。

小练习:

利用Lock和RLock实现线程间的简单同步,使得10个线程对同一共享变量进行递增操作,使用加锁机制保证变量结果的正确

# -*- coding: utf-8 -*-
import threading, time

class mythread(threading.Thread):

    def __init__(self):
    
        threading.Thread.__init__(self)
        
    def run(self):
    
        global n
        if lock.acquire():
            print('Thread:',n)
            n += 1
            lock.release()
            
n = 0
t = []
lock = threading.Lock()
for i in range(10):
    my = mythread()
    t.append(my)
for i in range(10):
    t[i].start()
for i in range(10):
    t[i].join()

运行结果如下:

Thread: 0
Thread: 1
Thread: 2
Thread: 3
Thread: 4
Thread: 5
Thread: 6
Thread: 7
Thread: 8
Thread: 9

原文地址:http://blog.51cto.com/9473774/2091399

时间: 2024-11-02 05:46:59

《可爱的Python》读书笔记(九)的相关文章

Clean Code 读书笔记九

要点汇总: 一般性问题 方法名称应该准确表达其具体行为 比如: Date newDate = date.add(5)//加5天?5个月? 最好使用addDaysTo 或increaseByDays 明确方法的行为. 使用多态 代替 switch或if else 比如: class RequestHandler { public void handleRequest(int action) { switch(action) { case LOGIN: doLogin(); break; case

读书笔记(九)

HAL:硬件抽象层 HAL ( Hardware Abstraction Layer,硬件抽象腔,是建立在Linux驱动之上的一套翻字库.这套程序 j率并不属于 Linux 内核, 而是属于 Linux 内核层之上的应用层. 在传统的 Linux.系统中Linux驱动一般有两种类型的代码:访问硬件寄存器的代码和业务逻辑有 码.对于访问硬件寄存器的代码,并没有什么秘密可言,因为这都是调用的 Linux 内核的标准函数〈如 io位ad32)进行的标准操作 而Linux驱动的业务逻辑部分对击有些企业或

how tomcat works 读书笔记九 Session管理

在看本文之前,请先查阅相关Session与Cookie的资料. Catalina通过一个叫管理器的组件来完成 session 管理工作,该组件由org.apache.catalina.Manager interface 接口表示.一个管理器通常跟一个上下文容器相关联,它负责创建.更行以及销毁 session 对象并能给任何请求组件返回一个合法的 session. Session对象 uml图如下: 看上图,我们知道我们使用的session其实是javax.servlet.http.HttpSes

《Linux内核设计与实现》读书笔记(十九)- 可移植性

摘自http://www.cnblogs.com/wang_yb/p/3512095.html <Linux内核设计与实现>读书笔记(十九)- 可移植性 linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个). 但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, Intel x86, MIPS和SPARC(虽然支持的还不是很完善). 从 v2.0版本开始加入了对 Motorala 68K和PowerPC

构建之法的八、九、十章读书笔记

构建之法读书笔记 第八章  需求分析 这一章主要是讲需求的分析,对于一个程序项目来说,我觉得,需求是这个项目的向导,他可以决定程序项目会发展成什么样子.书里面需求这里大致分为两个:软件需求和用户需求. 软件需求:我们不仅仅要考虑到项目功能的需求,要实现的功能,还要考虑到开发过程以及非功能方面的需求,还有综合需求. 用户需求:是针对在用户这个角度,用户最需要的东西.我觉得用户需求在需求分析中较为重要,毕竟每一个要做的程序的根本目的是满足用户的要求.      所以书里面野介绍了九种获取用户需求的调

Hadoop读书笔记(九)MapReduce计数器

Hadoop读书笔记系列文章:http://blog.csdn.net/caicongyang/article/category/2166855 1.MapReduce 计数器的作用 统计Map.Reduce以及Combiner执行的次数,可以用户简单判断代码的执行流程 2.MapReduce自带的计数器 14/11/26 22:28:51 INFO mapred.JobClient: Counters: 19 14/11/26 22:28:51 INFO mapred.JobClient: F

《Don&#39;t make me think》读书笔记

一,不要让我思考(第一原则) 不要让用户去思考,网站不是一本书籍,没有人会细细阅读,大家都是扫描读过整个网站. 每一个可能让用户停下来思考的模块或点,都应该避免,例如: 我在什么位置? 我该从哪里开始? 他们把xxx放在什么地方去了? 这个页面上最重要的是什么? 为什么他们给他取这个名字? 二,用户实际上是如何使用web的 用户仅仅是视觉扫描网站,而不会仔细阅读网站 用户在扫描过程中,会关注的地方: 所有样式明显突出显示的文字,与用户手头任务相关的内容,我们当前或接下来的兴趣,以及人类脑袋里根深

《深入理解计算机系统》 Chapter 7 读书笔记

<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时 运行时,由应用程序执行 链接器使分离编译称为可能. 一.编译器驱动程序 大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 1.将示例程序从ASCⅡ码源文件翻译成可执行目标文件的步骤 (1)运

《失控》读书笔记

某天早上看了下伯乐在线,然后发现一篇关于程序员读书的文章,看完之后,最后发现有一个QQ群,然后就加入了,群名称为“书山有志”.群里面的成员还比较活跃,过了几天进行二期读书选书投票,然后看到了有<失控>这本书作为选择,恰巧之前听说过一点关于这边书的传闻,更巧的是同事桌子上有一本纸质的<失控>放在那里暂时无人阅读,所以就投了一票失控,随后这本书入选开读,群主带头,几乎天天坚持看一章,然后一个月之后就读完了.而我没能如此,知道今天,用了差不多三个月吧,趁着这个周末在宿舍休养生息,完成了这

《别让不会说话害了你》---读书笔记

别让不会说话害了你[读书笔记] O .会说话才是人生的决胜点 1. 训练自己在大庭广众之下说话的勇气. 2. 三十秒就能抓住重点. 3. 看完书,开始开始自我演讲训练后,可以把自己训练的实况录下来,放在视频网站上,或者直接以附件的形式发邮件给作者,作者将在最短的时间内看完录像并回复,提供专业又深入的意见,指导我们更上一层楼. 一.消除恐惧发--认清恐惧,对症下药 1. 诚实面对自己,通过自我对话.自问自答,拉高视野重新审视一切的方式,就能面对恐惧的根源,针对既有的恐惧对症下药,使害怕的感觉烟消云