本文实例讲述了python开发之基于thread线程搜索本地文件的方法。分享给大家供大家参考,具体如下:
先来看看运行效果图:
利用多个线程处理搜索的问题,我们可以发现他很快....
下面是代码部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
# 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程序设计有所帮助。