7.多进程开发

<--目录-->

1、多进程

多进程官方文档

https://docs.python.org/2/library/multiprocessing.html

【多进程】

示例1:

#

!/usr/bin/env python
#coding:utf-8
from multiprocessing import Pool
def f(x):
    return x*x               #返回自乘值
if __name__ == ‘__main__‘:
    p = Pool(5)              #定义5个进程
    print (p.map(f,[1,2,3])) #调用f函数,把1,2.3传值给x,让他们自乘
示例2:(此脚本只能在Linux下使用产生效果)
#多进程使用方法:
#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Process
import os
import time
def info(title):
    print title
    print ‘module name:‘,__name__
    if hasattr(os, ‘getppid‘):
        print ‘parent process:‘, os.getppid()     #输出父进程ID
    time.sleep(3)
    print ‘process id:‘, os.getpid()              #输出子进程ID
def f(name):
    info(‘function f‘)
    print ‘hellow‘,name
if __name__ == ‘__main__‘:
    info(‘main line‘)
    print ‘---------------‘
    p = Process(target=f,args=(‘bob‘,))
    p.start()
    p.join()

使用方法:多少个核CPU就用多少个进程,或者用CPU核数的1倍

多进程使用和多线程使用不同点(此脚本只能在Linux下跑)
[[email protected] opt]# cat pro.py 
#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Process
import threading
def run(info_list,n):
    info_list.append(n)
    print info_list
info=[]
for i in range(10):
    p = Process(target=run,args=[info,i])     #多进程独享内存,十个进程 
    p.start()
print ‘---------threding-----‘
info=[]
for i in range(10):
    p = threading.Thread(target=run,args=[info,i])   #多线程共享内存,十个线程 
    p.start()

进程间的内存同步方法:(内存共享第一种方法)

[[email protected] opt]# vim multiprocess.py    
#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Process,Queue
def f(q,n):
    q.put([n,‘hello‘])
    print q.get()
    print q.get()
if __name__ == ‘__main__‘:
    q = Queue()
    q.put(‘ddd‘)
    for i in range(5):
        p = Process(target=f,args=(q,i))
        p.start()
    while True:
        print q.get()

内存共享的第二种方法

#!/usr/bin/env python
#coding:utf-8
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[:]

内存共享的第三种方法 (推荐使用,支持的类型比较多)

#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Process,Manager
def f(d,l):
    d[1] = ‘1‘       #给字典赋值
    d[2] = ‘2‘
    d[0.25] = None
    l.reverse        #把列表反向输出
if __name__ == ‘__main__‘:
    manger = Manager()
    d = manger.dict()  #获取字典,空字典
    l = manger.list(range(10))   #获取列表
    p = Process(target=f, args=(d,l))
    p.start()
    p.join()
    print d
    print l

通过Pool产生多进程,进程池Pool (不常用)

#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Pool
import time
def f(x):
    print x*x
    time.sleep(2)
    return x*x
pool = Pool(processes=5)  #每次跑5个进程
res_list = []
for i in range(10):
    res = pool.apply_async(f, [i,])  #定义十个进程
    #res = Process(target=f, args[i,])  #上面那一句相当于这一句的意思
    #print ‘----:‘,i
    res_list.append(res)
for r in res_list:
       print r.get()
#print pool.map(f.range(10))

#进程生成线程

#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Pool
import time
def f(x):
    info_list = []
    for i in range()5:
        t = threading.Thread(target =t_func,args=[info_list,i])
        t.start()
pool = Pool(processes=5)  #每次跑5个进程
res_list = []
for i in range(10):
    res = pool.apply_async(f, [i,])  #定义十个进程
    #res = Process(target=f, args[i,])  #上面那一句相当于这一句的意思
    print ‘----:‘,i
    res_list.append(res)
for r in res_list:
       print r.get(timeout=1)
#print pool.map(f.range(10))
1、创建进程程序
from multiprocessing import Process
import threading
import time
def Foo(i):
    print ‘say hi‘,i
for i in range(10):
    p = Process(target=Foo,args=(i,))
    p.start()

2、进程间的数据共享

默认各自持有一份

复制代码

#!/usr/bin/env python
#coding:utf-8
from multiprocessing import Process
from multiprocessing import Manager
import time
li = []
def Foo(i):
    li.append(i)
    print ‘say hi‘,li
 
for i in range(10):
    p = Process(target=Foo,args=(i,))
    p.start()
    
print li

通过特殊的数据结构,可以完成进程间的数据共享

复制代码

#方法一,Array
from multiprocessing import Process,Array
temp = Array(‘i‘, [11,22,33,44])
def Foo(i):
    temp[i] = 100+i
    for item in temp:
        print i,‘----->‘,item
for i in range(2):
    p = Process(target=Foo,args=(i,))
    p.start()
    p.join()

#方法二:manage.dict()共享数据

from multiprocessing import Process,Manager
manage = Manager()
dic = manage.dict()
def Foo(i):
    dic[i] = 100+i
    print dic.values()
for i in range(2):
    p = Process(target=Foo,args=(i,))
    p.start()
    p.join()

#方法三:manage.Namespace()共享数据

from multiprocessing import Process,Manager
manage = Manager()
namespace = manage.Namespace()
namespace.x = [11,22,33]
def Foo(i,dic):
    namespace.x = [11,22,33,i]
    print namespace
for i in range(2):
    p = Process(target=Foo,args=(i,namespace))
    p.start()
    p.join()
时间: 2024-10-26 12:13:09

7.多进程开发的相关文章

PHP高性能开发-多进程开发

硬件多核时代的软件业以前计算能力的提升一直在摩尔定律的指引下,沿着提升CPU时钟频率这条道路前进,从初期的几十MHz到如今的几GHz.但是,进入2002年以 来,CPU提升主频的困难越来越大,因为主频的提升带来了散热和功耗的大幅增加等问题.几年前,英特尔和AMD都调整了研究方向,开始研究在同一CPU中 放置多个执行内核. 尽管多核是一种硬件技术,但硬件和软件是相互依存的,硬件只是一种物质基础,只有有了软件的支持,才能使硬件拥有用武之地.如今,多核的优势已成共识:一在于“降低功耗”,解决了以往靠主

C#:多进程开发,控制进程数量

正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下: System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew( (object mystate) => { Process process = Process.Start("AutoCollectMrMultipleProcess.exe", mystate.ToString()); process.WaitF

《四》PHP多进程开发与Redis结合实践

业务逻辑介绍: 用户在 APP 上发帖子,然后存储到 Redis 的 List 列表中 利用 Linux 的 crontab 定时任务功能,按秒请求执行PHP脚本文件(processNewsRedisList.php) 调用 redis_process 处理API,进行存储到 Mysql 中 1.发帖子API public function post_json() { $image = $_FILES['image']; $data = I(); $images = $this->post_up

PHP多进程初探 --- 利用多进程开发点儿东西吧

[原文地址:https://blog.ti-node.com/blog...] 干巴巴地叨逼叨了这么久,时候表演真正的技术了! 做个高端点儿的玩意吧,加入我们要做一个任务系统,这个系统可以在后台帮我们完成一大波(注意是一大波)数据的处理,那么我们自然想到,多开几个进程分开处理这些数据,同时我们不能执行了php task.php后终端挂起,万一一不小心关闭了终端都会导致任务失败,所以我们还要实现程序的daemon化.好啦,开始了! 首先,我们第一步就得将程序daemon化了! // 设置umask

Android开发艺术探索——第二章:IPC机制(上)

Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化机制和Binder,然后详细的介绍Bundle,文件共享,AIDL,Messenger,ContentProvider和Socker等进程间通讯的方法,为了更好的使用AIDL进行进程间通讯,本章引入了Binder连接池的概念,最后,本章讲解各种进程间通信方式的优缺点和使用场景,通过本章,可以让读者对

Perl的多进程框架(watcher-worker)

关于perl的多进程,大家可能马上会想到Parallel::ForkManager这个模块.但是今天我们试着自己动手写一个类似的框架:) 该多进程开发模型从开源服务器框架Lighttpd发展而来,核心思路是父进程监控子进程的状态并负责回收,子进程负责任务的执行.当前预先可以设置子进程并发数目的上限值.如需要涉及到进程间的通信,可以通过建立管道pipe的方式,让子进程在结束前将数据通过共享管道写入,待父进程适时读取即可.  本人在工作中进程遇到这样的场景,如从DB取若干任务,收包等等(不停的取/收

VII (8) Python(并行开发)

VII8Python(并行开发) In [1]: import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better tha

PHP实现多进程

swoole 实现php多进程同步 PHP 本身是一个强领域的语言,主要应用于web开发. PHP 也可以进行多进程开发,但是使用的第三方扩展. 下面我们演示使用 swoole 实现 PHP多进程,且自定义进程名称,可启动及停止. 自定义进程名前缀:tprocess- 主进程名为:tprocess-master 子进程名为:tprocess-xxx xxx 为数字 停止进程有多种方式,比如 kill -9 强制杀死,但这样会导致任务在中间中断,出现脏数据 我们使用信号的方式,通知子进程,在下一个

Python进阶 - 多线程多进程基础

线程是最小的运行单元,进程是最小的资源管理单元. 串行 就是传统意义上的,同步,顺序的意思 进程:计算机中一个程序在一个数据集上 一次动态执行的过程,主要包含三部分内容 01>程序:描述进程的功能以及处理流程 02>数据集:功能处理过程中需要的资源数据 03>进程控制:严格控制进程执行过程中的各种状态 通俗来说,一个进程就是计算机上正在运行的一个程序 一个软件程序要运行,需要将软件依赖的数据加载到内存中,通过CPU进行运算并按照程序定义的逻辑结构进行流程控制,直到数据处理完成后程序退出