python学习笔记(六)---多进程

依据廖雪峰官方网站的python教程整理

fork进程

import os

# 多进程
# Unix/Linux操作系统提供了一个fork()系统调用,os.fork()封装了fork系统调用,windows系统无法使用
'''
print('Process (%s) start...' % os.getpid())
pid = os.fork()
if pid == 0:
    print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
    print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
'''

跨平台multiprocessing

from multiprocessing  import Process
import os

# multiprocessing模块就是跨平台版本的多进程模块
# multiprocessing模块提供了一个Process类来代表一个进程对象
# 子进程要执行的代码
def run_proc(name):
    print('Run child process %s (%s)...' % (name, os.getpid()))


if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('Child process will start.')
    # start()方法启动子进程
    p.start()
    # join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
    p.join()
    print('Child process end.')

进程池pool

from multiprocessing import Pool
import os, time, random


def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))


if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    # join()之前必须先调用close(), 之后就不能继续添加新的Process了
    p.close()
    #  join()方法会等待所有子进程执行完毕
    p.join()
    print('All subprocesses done.')

子进程subprocess

import subprocess

# subprocess模块可以让我们非常方便地启动一个子进程,然后控制其输入和输出
print('$ ping www.baidu.com')
r = subprocess.call(['ping', 'www.baidu.com', '-n', '1'])
print('Exit code:', r)

# 如果子进程还需要输入,则可以通过communicate()方法输入
print('$ nslookup')
p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('gbk'))
print('Exit code:', p.returncode)

进程间通信

from multiprocessing import Process, Queue
import os, time, random


# multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据
# 以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据
# 写数据进程执行的代码:
def write(q):
    print('Process to write: %s' % os.getpid())
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())


# 读数据进程执行的代码:
def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.get(True)
        print('Get %s from queue.' % value)


if __name__ == '__main__':
    # 父进程创建Queue,并传给各个子进程:
    tq = Queue()
    pw = Process(target=write, args=(tq,))
    pr = Process(target=read, args=(tq,))
    # 启动子进程pw,写入:
    pw.start()
    # 启动子进程pr,读取:
    pr.start()
    # 等待pw结束:
    pw.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()

# 在Unix/Linux下,multiprocessing模块封装了fork()调用,使我们不需要关注fork()的细节。
# 由于Windows没有fork调用,因此,multiprocessing需要“模拟”出fork的效果,父进程所有Python对象都必须通过pickle序列化再传到子进程去,
# 如果multiprocessing在Windows下调用失败了,要先考虑是不是pickle失败了。

更多更及时的博客更新请戳—> KingRumn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值