多进程Process

多进程旧式写法

from multiprocessing import Pool
def f(x):
    return x*x

if __name__ == ‘__main__‘:
    p = Pool(5)
    print(p.map(f,[1,2,3]))

  

多进程新式写法

from multiprocessing import Process
def run(num):
    print ‘this is ‘,num

for i in range(10):
    t = Process(target=run,args=(i,))
    t.start()

  

多进程-父子进程

from multiprocessing import Process
import os
def info(title):
        print title
        print ‘module name:‘,__name__
        if hasattr(os,‘getppid‘):
                print ‘parent process:‘,os.getppid()    #获取父进程PID
print ‘process id:‘,os.getpid()                 #获取子进程PID
def f(name):
        info(‘function f‘)  #子进程调用info函数
print ‘hello‘,name
if __name__ == ‘__main__‘:
        info(‘main line‘)   #父进程调用info函数
print ‘---------------‘
p = Process(target=f,args=(‘bob‘,))
        p.start()
        p.join()

  

进程数据共享

from multiprocessing import Process
li = []
def run(num):
    li.append(num)
    print ‘say hi‘,li

for i in range(10):
    t = Process(target=run,args=(i,))
    t.start()

print ‘ending‘,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()

  

#方法二: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()

  

#方法3,Queue
from multiprocessing import Process,Queue
def f(q,n):
    q.put([n,‘hello‘])
if __name__ == ‘__main__‘:
    q = Queue()
    for i in range(5):
        p = Process(target=f,args=(q,i))
        p.start()
    while True:
        print q.get()

  

#方法4,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()
    #d = {}
l = manager.list(range(10))
    #l = [0,1,2,4,5,6,7,8,9]
p = Process(target=f,args=(d,l))
    p.start()
    p.join()
    print d
    print l

  


进程锁
from multiprocessing import Process, Array, RLock
def Foo(lock,temp,i):
    """
将第0个数加100
    """
lock.acquire()      #加锁
temp[0] = 100+i
    for item in temp:
        print i,‘----->‘,item
    lock.release()      #解锁

lock = RLock()
temp = Array(‘i‘, [11, 22, 33, 44])
for i in range(20):
    p = Process(target=Foo,args=(lock,temp,i,))
    p.start()

  

进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async
from  multiprocessing import Process,Pool
import time

def Foo(i):
    time.sleep(2)
    return i+100

def Bar(arg):
    print arg

pool = Pool(5)
#print pool.apply(Foo,(1,))
#print pool.apply_async(func =Foo, args=(1,)).get()
for i in range(10):
    pool.apply_async(func=Foo, args=(i,),callback=Bar)

print ‘end‘
pool.close()
pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

  

from multiprocessing import Pool
import time
def f(x):
    print x*x
    #time.sleep(2)
return x*x

if __name__ == ‘__main__‘:
    pool = Pool(processes=2)   #同时5个进程
res_list = []
    for i in range(5):
        res = pool.apply_async(f,[i,])
        #res =  Process(target=f,args=[i,])
print ‘-----------‘,i
        res_list.append(res)
    for r in res_list:
        print ‘res_list:‘,r.get()

  


 

协程

线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

greenlet

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from greenlet import greenlet

def test1():
    print 12
    gr2.switch()
    print 34
    gr2.switch()

def test2():
    print 56
    gr1.switch()
    print 78

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()

  

gevent

import gevent

def foo():
    print(‘Running in foo‘)
    gevent.sleep(0)
    print(‘Explicit context switch to foo again‘)

def bar():
    print(‘Explicit context to bar‘)
    gevent.sleep(0)
    print(‘Implicit context switch back to bar‘)

gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])

  

遇到IO操作自动切换:

from gevent import monkey; monkey.patch_all()
import gevent
import urllib2

def f(url):
    print(‘GET: %s‘ % url)
    resp = urllib2.urlopen(url)
    data = resp.read()
    print(‘%d bytes received from %s.‘ % (len(data), url))

gevent.joinall([
        gevent.spawn(f, ‘https://www.python.org/‘),
        gevent.spawn(f, ‘https://www.yahoo.com/‘),
        gevent.spawn(f, ‘https://github.com/‘),
])

  

时间: 2024-10-25 05:49:34

多进程Process的相关文章

多进程multiprocessing

1.多进程Process 调用方法: from multiprocessing import Process,freeze_support import time def f(i): time.sleep(1) print(i) # 这里如果不写if __name__ == "__main__":的话会报freeze_support()错误 if __name__ == "__main__": for i in range(10): p = Process(targ

tcp通信:多进程共享listen socket方式

原文链接:http://blog.csdn.net/largetalk/article/details/7939080 看tornado源码多进程(process.py)那段,发现他的多进程模型和一般常见的模型有点不一样,多见的是主进程bind-> listen -> accept, 将accept返回的socket用子进程处理,而tornado是在bind -> listen -> fork, 在listen之后fork,多个子进程共享listen socket, 每个子进程都a

python多进程实例详解

写在前面:python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换. 1.multiprocessing模块提供了一个Process类来代表一个进程对象 import os import time import multiprocessing def run_pr

0704 Process继承实现多进程、Pool进程池,及Pool实现多进程实现复制文件

通过继承的方式,实现Process多进程 1 from multiprocessing import Process 2 import time 3 4 class MyNewProcess(Process): 5 def run(self): 6 for i in range(10): 7 print("----run----") 8 time.sleep(1) 9 10 11 if __name__ == "__main__": 12 p = MyNewProc

python多进程的理解 multiprocessing Process join run

最近看了下多进程. 一种接近底层的实现方法是使用 os.fork()方法,fork出子进程.但是这样做事有局限性的.比如windows的os模块里面没有 fork() 方法. windows:.linux: 另外还有一个模块:subprocess.这个没整过,但从vamei的博客里看到说也同样有局限性. 所以直接说主角吧 --- multiprocessing模块. multiprocessing模块会在windows上时模拟出fork的效果,可以实现跨平台,所以大多数都使用multiproce

Python程序中的进程操作-开启多进程(multiprocess.process)

目录 一.multiprocess模块 二.multiprocess.process模块 三.process模块介绍 3.1 方法介绍 3.2 属性介绍 3.3 在windows中使用process模块的注意事项 四.使用process模块创建进程 4.1 在Python中启动的第一个子进程 4.2 join方法 4.3 查看主进程和子进程的进程号 4.4 多个进程同时运行 4.5 多个进程同时运行,再谈join方法(1) 4.6 多个进程同时运行,再谈join方法(2) 4.7 通过继承Pro

创建一个多进程(multiprocessing.Process)

进程是资源的集合,每个进程至少包含一个线程 import multiprocessing #导入进程模块import time, threading #导入线程 def thread_run(): print(threading.get_ident())def run(name): time.sleep(2) print('hello', name) t = threading.Thread(target=thread_run) #创建一个线程 t.start() if __name__ ==

process 多进程写法 multiprocessing

from multiprocessing import Process def   f1(n):#普通 print(f1) if __name__ == '__main__': lst = [] for    i        in    range(10): p1 = Process(target=f1,args = (i,)) p1.start() lst.append(p1) [p.join()    for p   in lst] from multiprocessing import

python多进程——multiprocessing.Process

简介 multiprocessing是一个使用类似于threading模块的API支持生成进程的包.该multiprocessing软件包提供本地和远程并发.因此,该multiprocessing模块允许程序员充分利用给定机器上的多个处理器.可以在Unix和Windows上运行. multipleprocessing文档 Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) 应该始终使用关键