因为开发环境都是2.7的,所以不得不放弃python3,临时用python2来开发一些脚本.所以这里回顾了下python2的多进程开发.这里整理了几个小栗子. 希望可以解决问题.
multiprocessing
multiprocessing模块就是跨平台版本的多进程模块。
- multiprocessing模块提供了一个Process类来代表一个进程对象,
- 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动.
- join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
下面的例子演示了启动一个子进程并等待其结束:
from multiprocessing import Process
import os
def TestFunc(name):
print "Get Child Process info:{}-{}".format(name,os.getpid())
if __name__ == '__main__':
p=Process(target=TestFunc,args=("TestFunc",))
p.start()
p.join()
print "---------END---------"
输出:
Get Child Process info:TestFunc-10848
-------END-----------
Pool
如果要启动大量的子进程,可以用进程池的方式批量创建子进程.
Pool的默认大小是CPU的核数
import zipfile
import logging
import logging.handlers
import multiprocessing
import time
import os
log_filename="task_demo.log"
handler=logging.handlers.RotatingFileHandler(log_filename,maxBytes=20,backupCount=4)
def get_logger(name="root"):
logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')
return logging.getLogger(name)
def TestFunc(filename):
print("start jobs")
print(filename)
time.sleep(1)
print("end jobs")
return True
if __name__ == '__main__':
logger=get_logger()
# logger.addHandler(handler)
logger.info("--------------START JOBS-------------------")
worker_num=20
pool=multiprocessing.Pool(processes=worker_num)
path=r"C:\Users\youxi\Downloads\Flask-User-starter-app-master\Flask-User-starter-app-master"
task=os.listdir(path)
for i in task:
pool.apply_async(TestFunc,args=(i,))
logger.info("waitting for all subprocess done...")
pool.close()
pool.join()
logger.info("All subprocess done!")
进程间通讯
Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。
from multiprocessing import Process, Queue
import os, time, random
# 写数据进程执行的代码:
def write(q):
for value in ['A', 'B', 'C']:
print 'Put %s to queue...' % value
q.put(value)
time.sleep(random.random())
# 读数据进程执行的代码:
def read(q):
while True:
value = q.get(True)
print 'Get %s from queue.' % value
if __name__=='__main__':
# 父进程创建Queue,并传给各个子进程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 启动子进程pw,写入:
pw.start()
# 启动子进程pr,读取:
pr.start()
# 等待pw结束:
pw.join()
# pr进程里是死循环,无法等待其结束,只能强行终止:
pr.terminate()
网友评论