python 进程创建和共享内容的方法

1.使用Pool来创建进程

from multiprocessing import Pool
def f(n):
    return n*n
if __name__=="__main__":
    p=Pool(5)
    a=range(10)
    print(p.map(f,a))

p.map会将a列表中的数据依次循环给f函数。但是当函数需要两个参数时,该方法不适用。

2.使用Process来创建进程

def info(title):
    print title
    print ‘module name:‘, __name__
    if hasattr(os, ‘getppid‘):  # only available on Unix
        print ‘parent process:‘, os.getppid()
    print ‘process id:‘, os.getpid()

def f(name):
    info(‘function f‘)
    print ‘hello‘, name

if __name__ == ‘__main__‘:
    info(‘main line‘)
    p = Process(target=f, args=(‘bob‘,))
    p.start()
    p.join() #串行

3.使用Pool.apply_async(异步)

from multiprocessing import Pool
import time

def f(n):
    print n*n
    time.sleep(1)
    return n*n

if __name__ == ‘__main__‘:
    p = Pool(processes=5)
    res_list = []
    for i in range(10):
        res = p.apply_async(f,[i,])
        res_list.append(res)

    for item in res_list:
        print item.get()

共享内存的三种方法

1.使用multiprocessing中的Queue(将Queue封装了)

from multiprocessing import Process, Queue
import Queue as Q2
def f(q,n):
    q.put([n, ‘hello‘])
    print q.get()
if __name__ == ‘__main__‘:
    q = Q2.Queue()
    for i in range(5):
        p = Process(target=f, args=(q,i))
        p.start()
 #   print q.get()    # prints "[42, None, ‘hello‘]"

from multiprocessing import Process, Lock
import time
def f(i):
  #  l.acquire()
    time.sleep(1)
    print ‘hello world‘, i
   # l.release()

if __name__ == ‘__main__‘:
   # lock = Lock()
    for num in range(10):
        Process(target=f, args=[num]).start()

2.使用values和array(灵活性较差,不推荐使用)

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == ‘__main__‘:
    num = Value(‘d‘, 0.0)
    arr = Array(‘i‘, range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print num.value
    print arr[:]

3.使用Manager

from multiprocessing import Process, Manager

def f(d, l):
    d[1] = ‘1‘
    d[‘2‘] = 2
    d[0.25] = None
    l.reverse()

if __name__ == ‘__main__‘:
    manager = Manager()

    d = manager.dict()
    l = manager.list(range(10))

    p = Process(target=f, args=(d, l))
    p.start()
    p.join()

    print d
    print l
时间: 2024-10-13 16:07:31

python 进程创建和共享内容的方法的相关文章

python进程创建过程和方法

#multiprocess.process模块 #process模块是一个创建进程的模块,借助这个模块,可以完成进程的创建 # Process([group[,target[,name[,args[,kwargs]]]]]) ,由该实例化得到的对象, # 表示一个子进程的任务(尚未启动) #注意(参数介绍): #1.需要使用关键字参数的方式来指定参数 #2.args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号 #3.group参数为使用,值始终未None #4.target

Python 动态创建函数【转】

知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简单, func = lambda: "foobar" 可以认为lambda函数是最常用的一种方式. 定义局部函数 Python中函数可以在代码块中进行定义,比如decorator就是通过这种方式实现的, def decorator(func): def _(*args, **kwargs)

【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通信,在一个进程之中,只能单一的对其写或者是读,而不可以及执行写操作又执行读操作.这一点,我们可以将其想象成我们的水管,分别连着不同的两端,在有水流的时候,一端只能进行输入,另一端只能进行输出,而不可以同时输入和输出. 管道又分为有名管道和匿名管道,两者的区别在于对于匿名管道,其只能在具有亲缘关系的父

Python Process创建进程的(2种方法)

Python 在 multiprocessing 模块下提供了 Process 来创建新进程.与 Thread 类似的是,使用 Process 创建新进程也有两种方式: 以指定函数作为 target,创建 Process 对象即可创建新进程. 继承 Process 类,并重写它的 run() 方法来创建进程类,程序创建 Process 子类的实例作为进程. Process 类也有如下类似的方法和属性: run():重写该方法可实现进程的执行体. start():该方法用于启动进程. join([

深入学习python解析并读取PDF文件内容的方法

这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应用.主要参考了一些已有的博客内容,代码. 主要思路是首先利用一个做项目的形式,描述所做的问题,运行环境,和需要安装的库,然后写代码,此代码是在python2.7中运行,然后写出在python3.6中运行的代码,并详细解释python2.7和python3.6中python库的一些不同之处,最后详细的

python的multiprocessing模块进程创建、资源回收-Process,Pool

python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork() 举例: 1 import os 2 pid = os.fork() # 创建一个子进程 3 os.wait() # 等待子进程结束释放资源 4 pid为0的代表子进程. 缺点:1.兼容性差,只能在类linux系统下使用,windows系统不可使用:2.扩展性差,当需要多条进程的时候,进程管理变得

python 进程内存增长问题, 解决方法和工具

python 进程内存增长问题, 解决方法和工具 表现 解决方法 定位问题过程 gdb-python: 搞清楚python程序在做什么 准备gdb 接入gdb 查看线程 查看调用栈 coredump 其他命令 pyrasite: 连接进入python程序 psutil 查看python进程状态 guppy 取得内存使用的各种对象占用情况 无法回收的对象 不可回收对象的例子 ?? objgraph 查找循环引用 表现 运行环境: # uname -a Linux ** 3.10.0-327.el7

cocos2d-x使用python脚本创建项目的简单方法

本文有CC原创.转载请注明地址:http://blog.csdn.net/oktears/article/details/13297003 在cocos2d-x2.1.4以上的版本号中.取消了使用vs模版创建项目的方法,開始使用python脚本创建项目,使用python创建项目须要在命令行敲非常多指令,比較麻烦. 我把这些命令组合在一起,放在了一个批处理文件里.直接双击打开批处理文件就能够通过几个简单的指令来创建项目. 第一步: 新建一个txt文件.将以下这段代码拷贝进去,保存文件.将文件名称改

Python中的对象行为与特殊方法(一)对象的创建与销毁

Python中类调用__new__()类方法来创建实例,调用__init__()方法来初始化对象,对象的销毁则调用__del__()方法. __new__()方法第一个参数为类cls,通常返回cls的一个实例,然后新实例的__init__()方法将以类似于__init__(self[, ...])的方式被调用,self是创建的新的实例,其它的参数和传递给__new__()的参数一样. 如果__new__()方法不返回cls 的实例,那么__init__()将不会被调用. 对于一个类来说: cla