• python 多进程


    #coding:utf-8
    #要让Python程序实现多进程(multiprocessing)
    #Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。
    #普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统
    #自动把当前进程(父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回
    #子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程
    #所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID

    import os

    #打印出当前进程的进程ID
    print 'Process(%s) start...' % os.getpid()
    #创建一个子进程,process会有两个返回值
    #当process为0时为子进程
    process = os.fork()

    if process == 0 :
    print 'I am child process(%s) and my parent is %s' % (os.getpid(), os.getppid())
    else:
    print 'I (%s) just created a child process(%s)' %(os.getpid(), pid)

    multiprocessing的使用

    #coding:utf-8
    #multiprocessing模块就是跨平台版本的多进程模块
    #multiprocessing模块提供了一个Process类来代表一个进程对象
    from multiprocessing import Process
    import os

    #子进程要执行的代码
    def run_proc(name):

    print 'Run child process %s (%s)...' % (name, os.getpid())

    #创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例
    #join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步

    if __name__ == '__main__':

    #输出主线程的id
    print 'Parent process %s' % os.getpid()
    #创建一个Process实例
    p = Process(target = run_proc,args = ('test',))

    print 'Process will start'

    p.start()

    #子进程会阻塞主线程
    p.join()

    print 'Process end'

    进程池的使用

    #coding:utf-8
    #进程池
    from multiprocessing import Pool
    import os,time,random

    def long_time_task(name):

    print 'Run task %s (%s)..' %(name,os.getpid())

    start = time.time()

    time.sleep(random.random()*3)

    end = time.time()

    print 'Task %s runs %0.2f seconds' % (name,(end - start))


    if __name__ == '__main__' :

    print 'Parent process %s ' % os.getpid()

    #对Pool对象调用join()方法会等待所有子进程执行完毕
    #调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process
    p = Pool()

    for i in range(5):

    p.apply_async(long_time_task,args =(i,))

    print 'Waiting for all subprocess done ..'

    p.close()

    p.join()

    print 'All subprocess done'

    进程之间进行通信 

    #coding:utf-8

    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.start()

    pr.start()

    #等待pw结束
    pw.join()

    #pr进程里是死循环,无法等待其结果,只能强行终止

    pr.terminate()

  • 相关阅读:
    笔记。------数组
    图片与文字的对齐方式
    clear:both;和overflow:hidden;的应用理解。
    淘宝首页
    错误:编码GBK的不可映射字符
    Java基础之反射
    (一)Servlet简介
    Windows10快捷键
    (二)Maven的安装与环境配置
    (一)Maven简介
  • 原文地址:https://www.cnblogs.com/paulversion/p/8309463.html
Copyright © 2020-2023  润新知