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

作者:Hongten 时间:2023-05-11 18:49:12 

本文实例讲述了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,thread,线程
0
投稿

猜你喜欢

  • 基于python分布式爬虫并解决假死的问题

    2021-06-28 03:38:28
  • 基于Python实现新年倒计时

    2022-02-14 08:41:59
  • 大数据量高并发的数据库优化详解

    2024-01-18 14:21:50
  • 客户端和服务端的编码“陷阱”

    2007-12-21 19:19:00
  • Python教程之Python多态的深层次理解

    2021-07-30 07:50:53
  • 详解python异步编程之asyncio(百万并发)

    2022-05-09 04:44:12
  • python 遍历pd.Series的index和value

    2021-12-27 15:50:42
  • Python第三方库的几种安装方式(小结)

    2021-11-01 19:34:09
  • Python实现简单求解给定整数的质因数算法示例

    2021-05-27 09:23:08
  • Android+OpenCv4实现边缘检测及轮廓绘制出图像最大边缘

    2022-04-08 18:05:44
  • 基于Pydantic封装的通用模型在API请求验证中的应用详解

    2022-02-20 20:12:24
  • Pandas对数值进行分箱操作的4种方法总结

    2023-08-09 02:52:04
  • Python 3.x基于Xml数据的Http请求方法

    2021-05-17 23:45:18
  • 《写给大家看的设计书》阅读笔记之色彩

    2009-07-30 12:45:00
  • Go语言函数学习教程

    2024-02-22 14:17:41
  • Python全栈之模板渲染详解

    2021-06-07 12:39:48
  • 你应该知道的Python3.6、3.7、3.8新特性小结

    2023-10-14 02:18:37
  • python学习入门细节知识点

    2022-09-07 06:40:53
  • python给视频添加背景音乐并改变音量的具体方法

    2021-01-26 20:18:47
  • 浅谈tensorflow语义分割api的使用(deeplab训练cityscapes)

    2022-03-16 23:24:01
  • asp之家 网络编程 m.aspxhome.com