Python之进程(multiprocessing)

1、multiprocessing模块简介——进程基于“threading”的接口编程

multiprocessing模块支持建立进程——使用threading模块类似的API。multiprocessing模块对本地和远程的并发都提供了支持,使用子进程(subprocesses)来替代threads解决了GIL的限制。所以,multiprocessing模块容许程序充分利用给定设备的多核资源。在Unix和Windows系统均可以运行。安全

 multiprocessing模块一样引入了threading模块不支持的APIs。主要例子如:Pool对象提供了便捷并行执行(有多输入)的函数的执行,经过进程分发输入数据。下面就是一个简单的数据分发。多线程

from multiprocessing import Pool

def f(x):
    return x*x

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

2、Process类并发

在multiprocessing模块中,processes能够经过建立一个Process对象产生。而后调用其start()方法。Process和threading.Thread遵循threading.Thread的API。一个简单的多线程例子以下ide

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
样例

显示相应的单个进程IDs,以下:函数

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())
    print('process id:', os.getpid())


def f(name):
    time.sleep(2)
    info('function f')
    print('hello', name)

if __name__ == '__main__':

    info('main line')
    p = Process(target=f,args=('bob',))
    p.start()
    p.join()
样例

 3、Exchanging objects between processes进程间通信ui

一、Queue基本上是Queue.Queue的克隆版,可是本Queue是线程和进程都安全的spa

from multiprocessing import Process, Queue
import time


def f(q):
    time.sleep(2)
    q.put([42, None, 'hello'])
    print('f')

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    p.join()
    print('hello')
    print(q.get())
样例

二、Pipes是Pipe()函数返回一个链接对象对——由一个pipe链接,默认是双工(两种方式)线程

from multiprocessing import Process, Pipe


def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    p.join()
样例

Pipe()返回两个链接(Connection)对象,表明管道的两端。每一个链接对象都有send()和recv()方法(彼此之间)。code

注意:若是两个线程(或进程)同时尝试从pipe的同一端读写数据,管道里的数据可能损坏。若是同时在pipe()的两端读写是没有风险的。

4、进程间的同步机制

multiprocessing拥有threading模块相同的同步机制。例如,能够使用lock来保证一次只有一个进程打印到标准输出。

from multiprocessing import Process,Lock
import time


def f(l, i):
    l.acquire()
    # time.sleep(2)
    print('hello world', i)
    l.release()

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        Process(target=f,args=(lock, num)).start()
利用锁线程同步

5、进程间共享状态

如上所述,咱们在作并发编程时,应当尽量避免使用共享状态。有其是多进程。然而,你非得在多进程使用共享数据,multiprocessing提供了几种方来实现。

一、Shared memory共享内存

数据能够存储在共享内存里使用Value或Array。例如,以下代码:

相关文章
相关标签/搜索