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演示数型数据结构的教程
Apr 03 Python
python中input()与raw_input()的区别分析
Feb 27 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python调用百度语音识别api
Aug 30 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
python学习开发mock接口
Apr 28 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
python求解汉诺塔游戏
Jul 09 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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微信开发之二维码生成类
2015/06/26 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
vue删除html内容的标签样式实例
2018/09/13 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
pygame实现打字游戏
2021/02/19 Python
Python多进程编程常用方法解析
2020/03/26 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
幼儿园中班教学反思
2014/02/10 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
大学活动总结模板
2014/07/10 职场文书
自查自纠整改报告
2014/11/06 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
入党团支部推荐意见
2015/06/02 职场文书
Python实现Hash算法
2022/03/18 Python