最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-27 14:34:52
文档

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

python开发之基于thread线程搜索本地文件的方法:本文实例讲述了python开发之基于thread线程搜索本地文件的方法。分享给大家供大家参考,具体如下: 先来看看运行效果图: 利用多个线程处理搜索的问题,我们可以发现他很快.... 下面是代码部分: # A parallelized find(1) using th
推荐度:
导读python开发之基于thread线程搜索本地文件的方法:本文实例讲述了python开发之基于thread线程搜索本地文件的方法。分享给大家供大家参考,具体如下: 先来看看运行效果图: 利用多个线程处理搜索的问题,我们可以发现他很快.... 下面是代码部分: # A parallelized find(1) using th
 本文实例讲述了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.
' % (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线程搜索本地文件的方法

python开发之基于thread线程搜索本地文件的方法:本文实例讲述了python开发之基于thread线程搜索本地文件的方法。分享给大家供大家参考,具体如下: 先来看看运行效果图: 利用多个线程处理搜索的问题,我们可以发现他很快.... 下面是代码部分: # A parallelized find(1) using th
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top