美文网首页
python2-多进程

python2-多进程

作者: 向暖而生 | 来源:发表于2023-08-22 21:37 被阅读0次

因为开发环境都是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()

相关文章

  • UNIX基础--进程和守护进程

    进程和守护进程 Processes and Daemons 进程(Processes) FreeBSD 是一个多任...

  • rsync服务企业应用

    守护进程服务企业应用: 守护进程多模块功能配置 守护进程的排除功能实践 守护进程来创建备份目录 守护进程的访问控制...

  • Nginx 的进程结构,你明白吗?

    Nginx 进程结构 这篇文章我们来看下 Nginx 的进程结构,Nginx 其实有两种进程结构: 单进程结构 多...

  • 进程/线程

    进程和线程 多任务的介绍 进程的介绍 多进程完成多任务 获取进程编号 进程的注意点 文件夹高并发copy器 1、多...

  • 多易日记进程

    10.29 解决移动端适配问题:采用手淘写的lib-flexible解决移动端的适配,采用pxToRem解决px转...

  • 使用ipc为 electron 实现一个无用的通信轮子

    入门学习electron时了解到,渲染进程与主进程存在一对多的关系, 渲染进程与主进程需要通过ipc或remote...

  • mysql(三)

    MySQL多实例 什么是实例? 一个进程+多个线程+预分配的内存结构 什么是多实例? 多个进程+多个线程+多个预分...

  • 线程和线程池

    线/进程、多线/多进程、线程并发/并行 一、线程、进程概念 进程:是程序的一次运行活动,由系统资源分配和调度的一个...

  • python2->3编码格式坑

    两年前用HttpRunner框架做了接口自动化,最近再次用发现改动很大,特别是从python2升到了python3...

  • Python札记52_进程和线程2

    在之前的札记Python札记50_进程和线程1中介绍了进程、线程和子进程以及多进程的相关知识,本札记中重点介绍多线...

网友评论

      本文标题:python2-多进程

      本文链接:https://www.haomeiwen.com/subject/raiumdtx.html