multiprocessing 充分利用cpu多核
一般情况下cpu密集使用进程池,IO密集使用线程池。python下想要充分利用多核CPU,就用多进程。
pool = multiprocessing.Pool(multiprocessing.cpu_count())
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
group:进程所属组。基本不用
target:表示调用对象。
args:表示调用对象的位置参数元组。
name:别名
kwargs:表示调用对象的字典。
join()方法表示等待子进程结束以后再继续往下运行,通常用于进程间的同步。
#!/usr/bin/env python
#coding=utf-8
import multiprocessing
def do(n) :
name = multiprocessing.current_process().name
print name,'starting'
print "worker ", n
if __name__ == '__main__' :
for i in xrange(5) :
p = multiprocessing.Process(target=do, args=(i,)) //加,才是元组,不加的话str中的每个字符作为参数传递
p.start()
p.join()
print "Process end."
multiprocessing 模块下的Pool类
from multiprocessing import Pool
apply_async(func[, args=()[, kwds={}[, callback=None]]])
它是非阻塞且支持结果返回进行回调。
pool = multiprocessing.Pool(processes = 3)
for i in xrange(4):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, )) //非阻塞
pool = multiprocessing.Pool(processes = 3)
for i in xrange(4):
msg = "hello %d" %(i)
pool.apply(func, (msg, )) //阻塞,等一个进程执行完再执行下一个
import multiprocessing
import time
def func(msg):
print "msg:", msg
time.sleep(3)
print "end"
return "done" + msg
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = []
for i in xrange(3):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg, ))) //结果回调
pool.close()
pool.join()
for res in result:
print ":::", res.get()
print "Sub-process(es) done."
map(func, iterable[, chunksize=None])
它会使进程阻塞直到返回结果。
#coding: utf-8
import multiprocessing
def m1(x):
print x * x
if __name__ == '__main__':
pool = multiprocessing.Pool(multiprocessing.cpu_count())
i_list = range(8)
pool.map(m1, i_list)
os.walk()可以得到一个三元tupple(dirpath, dirnames, filenames),
第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
dirpath 是一个string,代表目录的路径,
dirnames 是一个list,包含了dirpath下所有子目录的名字。
filenames 是一个list,包含了非目录文件的名字。
import os
import os.path
fileDir = os.sep + "export" + os.sep + "sh" + os.sep + "cate3_expandnames"
for root, dirs, files in os.walk(fileDir):
for name in files:
print os.path.join(root, name)
for a in os.walk(fileDir):
print(a[0])
print(a[1])
print(a[2])
一般情况下cpu密集使用进程池,IO密集使用线程池。python下想要充分利用多核CPU,就用多进程。
pool = multiprocessing.Pool(multiprocessing.cpu_count())
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
group:进程所属组。基本不用
target:表示调用对象。
args:表示调用对象的位置参数元组。
name:别名
kwargs:表示调用对象的字典。
join()方法表示等待子进程结束以后再继续往下运行,通常用于进程间的同步。
#!/usr/bin/env python
#coding=utf-8
import multiprocessing
def do(n) :
name = multiprocessing.current_process().name
print name,'starting'
print "worker ", n
if __name__ == '__main__' :
for i in xrange(5) :
p = multiprocessing.Process(target=do, args=(i,)) //加,才是元组,不加的话str中的每个字符作为参数传递
p.start()
p.join()
print "Process end."
multiprocessing 模块下的Pool类
from multiprocessing import Pool
apply_async(func[, args=()[, kwds={}[, callback=None]]])
它是非阻塞且支持结果返回进行回调。
pool = multiprocessing.Pool(processes = 3)
for i in xrange(4):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, )) //非阻塞
pool = multiprocessing.Pool(processes = 3)
for i in xrange(4):
msg = "hello %d" %(i)
pool.apply(func, (msg, )) //阻塞,等一个进程执行完再执行下一个
import multiprocessing
import time
def func(msg):
print "msg:", msg
time.sleep(3)
print "end"
return "done" + msg
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = []
for i in xrange(3):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg, ))) //结果回调
pool.close()
pool.join()
for res in result:
print ":::", res.get()
print "Sub-process(es) done."
map(func, iterable[, chunksize=None])
它会使进程阻塞直到返回结果。
#coding: utf-8
import multiprocessing
def m1(x):
print x * x
if __name__ == '__main__':
pool = multiprocessing.Pool(multiprocessing.cpu_count())
i_list = range(8)
pool.map(m1, i_list)
os.walk()可以得到一个三元tupple(dirpath, dirnames, filenames),
第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
dirpath 是一个string,代表目录的路径,
dirnames 是一个list,包含了dirpath下所有子目录的名字。
filenames 是一个list,包含了非目录文件的名字。
import os
import os.path
fileDir = os.sep + "export" + os.sep + "sh" + os.sep + "cate3_expandnames"
for root, dirs, files in os.walk(fileDir):
for name in files:
print os.path.join(root, name)
for a in os.walk(fileDir):
print(a[0])
print(a[1])
print(a[2])