python2-多进程

因为开发环境都是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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容