python开发之基于thread线程搜索本地文件的方法


Posted in Python onNovember 11, 2015

本文实例讲述了python开发之基于thread线程搜索本地文件的方法。分享给大家供大家参考,具体如下:

先来看看运行效果图:

python开发之基于thread线程搜索本地文件的方法

利用多个线程处理搜索的问题,我们可以发现他很快....

下面是代码部分:

# A parallelized "find(1)" using the thread module.
# This demonstrates the use of a work queue and worker threads.
# It really does do more stats/sec when using multiple threads,
# although the improvement is only about 20-30 percent.
# (That was 8 years ago. In 2002, on Linux, I can't measure
# a speedup. :-( )
# I'm too lazy to write a command line parser for the full find(1)
# command line syntax, so the predicate it searches for is wired-in,
# see function selector() below. (It currently searches for files with
# world write permission.)
# Usage: parfind.py [-w nworkers] [directory] ...
# Default nworkers is 4
import sys
import getopt
import time
import os
from stat import *
import _thread as thread
# Work queue class. Usage:
#  wq = WorkQ()
#  wq.addwork(func, (arg1, arg2, ...)) # one or more calls
#  wq.run(nworkers)
# The work is done when wq.run() completes.
# The function calls executed by the workers may add more work.
# Don't use keyboard interrupts!
class WorkQ:
  # Invariants:
  # - busy and work are only modified when mutex is locked
  # - len(work) is the number of jobs ready to be taken
  # - busy is the number of jobs being done
  # - todo is locked iff there is no work and somebody is busy
  def __init__(self):
    self.mutex = thread.allocate()
    self.todo = thread.allocate()
    self.todo.acquire()
    self.work = []
    self.busy = 0
  def addwork(self, func, args):
    job = (func, args)
    self.mutex.acquire()
    self.work.append(job)
    self.mutex.release()
    if len(self.work) == 1:
      self.todo.release()
  def _getwork(self):
    self.todo.acquire()
    self.mutex.acquire()
    if self.busy == 0 and len(self.work) == 0:
      self.mutex.release()
      self.todo.release()
      return None
    job = self.work[0]
    del self.work[0]
    self.busy = self.busy + 1
    self.mutex.release()
    if len(self.work) > 0:
      self.todo.release()
    return job
  def _donework(self):
    self.mutex.acquire()
    self.busy = self.busy - 1
    if self.busy == 0 and len(self.work) == 0:
      self.todo.release()
    self.mutex.release()
  def _worker(self):
    time.sleep(0.00001)   # Let other threads run
    while 1:
      job = self._getwork()
      if not job:
        break
      func, args = job
      func(*args)
      self._donework()
  def run(self, nworkers):
    if not self.work:
      return # Nothing to do
    for i in range(nworkers-1):
      thread.start_new(self._worker, ())
    self._worker()
    self.todo.acquire()
# Main program
def main():
  nworkers = 4
  #print(getopt.getopt(sys.argv[1:], '-w:'))
  opts, args = getopt.getopt(sys.argv[1:], '-w:')
  for opt, arg in opts:
    if opt == '-w':
      nworkers = int(arg)
  if not args:
    #print(os.curdir)
    args = [os.curdir]
  wq = WorkQ()
  for dir in args:
    wq.addwork(find, (dir, selector, wq))
  t1 = time.time()
  wq.run(nworkers)
  t2 = time.time()
  sys.stderr.write('Total time %r sec.\n' % (t2-t1))
# The predicate -- defines what files we look for.
# Feel free to change this to suit your purpose
def selector(dir, name, fullname, stat):
  # Look for world writable files that are not symlinks
  return (stat[ST_MODE] & 0o002) != 0 and not S_ISLNK(stat[ST_MODE])
# The find procedure -- calls wq.addwork() for subdirectories
def find(dir, pred, wq):
  try:
    names = os.listdir(dir)
  except os.error as msg:
    print(repr(dir), ':', msg)
    return
  for name in names:
    if name not in (os.curdir, os.pardir):
      fullname = os.path.join(dir, name)
      try:
        stat = os.lstat(fullname)
      except os.error as msg:
        print(repr(fullname), ':', msg)
        continue
      if pred(dir, name, fullname, stat):
        print(fullname)
      if S_ISDIR(stat[ST_MODE]):
        if not os.path.ismount(fullname):
          wq.addwork(find, (fullname, pred, wq))
# Call the main program
main()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 除法小技巧
Sep 06 Python
pyside写ui界面入门示例
Jan 22 Python
Python 数据结构之旋转链表
Feb 25 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
Django实现表单验证
Sep 08 Python
Python列表切片操作实例总结
Feb 19 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
python如何利用Mitmproxy抓包
Oct 10 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 #Python
Python复制文件操作实例详解
Nov 10 #Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 #Python
Python 文件管理实例详解
Nov 10 #Python
Python list操作用法总结
Nov 10 #Python
python控制台中实现进度条功能
Nov 10 #Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 #Python
You might like
奇怪的PHP引用效率问题分析
2012/03/23 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
requests和lxml实现爬虫的方法
2017/06/11 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
python3实现名片管理系统
2020/11/29 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
python软件都是免费的吗
2020/06/18 Python
python os模块在系统管理中的应用
2020/06/22 Python
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
.NET方向面试题
2014/11/20 面试题
法人授权委托书
2014/09/16 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
民事调解协议书
2016/03/21 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
Python实现学生管理系统(面向对象版)
2021/06/24 Python
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang