Python multiprocessing 多线程示例

发布时间: 更新时间: 总字数:480 阅读时间:1m 作者: 分享 复制网址

Python 多线程示例

介绍

多进程间通信,可以使用 multiprocessing 模块提供了 QueuePipes

  • os.fork() 创建子进程,如果返回值为0,则是子进程,否则是父进程
  • 由于 windows 平台不支持 fork 方法,所以python提供 multiprocessing 模块来跨平台多进程,multiprocessing 模块封装了 fork() 调用,multiprocessing模块提供Process类代表进程
    • 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用 start() 方法启动
  • 如果要启动大量的子进程,可以用进程池的方式批量创建子进程,from multiprocessing import Pool
  • multiprocessing.Pipe() 一般用于进程或线程间的通信,创建管道时返回两个连接对象,代表管道的两端
    • 类似的 os.pipe(),但它主要用来创建两个文件描述符,一个读,一个写,单向通信

示例

multiprocessing.Pipe

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

from multiprocessing import Process, Pipe


def send(pipe):
    pipe.send('i am something ...')
    print(f'send got: {pipe.recv()}')
    pipe.close()


def recv(pipe):
    pipe.send(dict(name='xianbin', age=18))
    print(f'recv got: {pipe.recv()}')
    pipe.close()


if __name__ == '__main__':
    (con1, con2) = Pipe()
    sender = Process(target=send, name='send', args=(con1,))
    sender.start()

    recver = Process(target=recv, name='talk', args=(con2,))
    recver.start()

multiprocessing.Pool

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

import os
import time
import random
from multiprocessing import Pool


def sub_task(name):
    spid = os.getpid()
    print('run sub task name is {}, sub pid is {}...'.format(name, spid))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('sub task %s runs %0.2f seconds.' % (name, (end - start)))
    return spid


if __name__=='__main__':
    print('main process %s.' % os.getpid())
    p = Pool(4)
    results = []
    for i in range(10):
        r = p.apply_async(sub_task, args=(i,))
        results.append(r)
    print('Waiting for all subprocesses done...')

    for r in results:
        print("-- result {}".format(r.get()))
    p.close()
    p.join()
    print('All sub proceess done.')
最新评论
加载中...
Home Archives Categories Tags Statistics