1.进程池
进程池技术的应用至少由以下两部分组成:
资源进程:
预先创建好的空闲进程,管理进程会把工作分发到空闲进程来处理。
管理进程:
管理进程负责创建资源进程,把工作交给空闲资源进程处理,回收已经处理完工作的资源进程。
上面资源进程跟管理进程的概念很好理解,下面就是进程池的关键,管理进程如何有效的管理资源进程,分配任务给资源进程,回收空闲资源进程,管理进程要有效的管理资源进程,那么管理进程跟资源进程间必然需要交互,通过IPC,信号,信号量,消息队列,管道等进行交互。
2.代码
import os
import multiprocessing
import hashlib
#BUFERSIZE:读取缓冲区大小
#Poolsize:工作进程数量
BUFSIZE=8192
POOLSIZE=2
def compute_digest(filename):
try:
f=open(filename,'rb')
except IOError:
return None
digest=hashlib.sha512()
while True:
chunk=f.read(BUFSIZE)
if not chunk:break
digest.update(chunk)
f.close()
return filename,digest.digest()
def build_digest_map(topdir):
digest_pool=multiprocessing.Pool(POOLSIZE)
allfiles=(os.path.join(path,name) for path,dirs,files in os.walk(topdir) for name in files )
digest_map=dict(digest_pool.imap_unordered(compute_digest,allfiles,20))
digest_pool.close()
return digest_map
if __name__=='__main__':
digest_map=build_digest_map(r'F:Anaconda3Libsite-packagessklearn')
print(len(digest_map))
multiprocesssing.Pool.imap_unordered(func,iterable,[,chunksize])
返回迭代器而非结果列表,与imap的区别在于结果的顺序根据从工作进程接受到的时间任意确定。
hashlib:摘要算法
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
python中hashlib有MD5,SHA1,SHA126,SHA256等
关于哈希算法参见廖雪峰大神的blog