前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python中的多进程运用

python中的多进程运用

作者头像
云雀叫了一整天
发布2019-09-29 17:43:58
4900
发布2019-09-29 17:43:58
举报
文章被收录于专栏:Hi, PythonHi, Python

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_40313634/article/details/100937313

1. 程序中另起进程

代码语言:javascript
复制
from multiprocessing import Process
from os import getpid
from time import sleep

def run_time(name):
    sleep(5)
    print('child progress {}: {}'.format(name, getpid()))

if __name__ == '__main__':
    print('parent progress id: {}'.format(getppid()))  # os.getpid(): 获取当前进程ID; os.getppid(): 获取父进程ID
    p = Process(target=run_time, args=('hello_world',))  # 初始化子进程:target=目前函数名, args=参数
    print('start child progress')
    p.start()  # 启动子进程
    p.join()  # 进程同步:等待子进程执行完毕,程序再向下执行
    print('end child progress')
方法
  • getppid()、getpid()
  • p.start()
  • p.join()
  • Process(target=, args=(,))
  • Pool(n)
  • p.apply_async(, args=(,))
  • subprocess.call([’’, ‘’])
  • Queue()
  • q.put(value)
  • q.get(True)

2. 进程池

代码语言:javascript
复制
from multiprocessing import Pool
from os import getpid
from time import sleep

def long_time_task(name):
    sleep(5)
    print('child process {0}: {1}\n'.format(name, getpid()))

if __name__ == '__main__':
    print('parent process: {0}\n'.format(getpid()))
    p = Pool(2)  ## 初始化进程池:一次可并行执行2个进程(等这两个执行结束,再次启动执行接下来的两个,和电脑是几核的无关)

    for i in range(10):
        p.apply_async(long_time_task, args=(i,))  ## 进程池添加进程
    print('start child progress\n')
    p.close()  ## 关闭进程池(不能再添加新进程了),准备执行进程
    p.join()  # 进程同步
    print('end child progress\n')

3. 问题:无法获取子进程的执行结果 -> 子进程

代码语言:javascript
复制
import subprocess

print('nslookup www.python.org')
r = subprocess.call(['nslookup', 'www.python.org'])
print('Exit code: {}'.format(r))

4. 进程间通信

  • 队列:Queue
代码语言:javascript
复制
from multiprocessing import Process, Queue
from time import sleep
from random import random

def write(q):
    for i in range(5):
        print('puts {}'.format(i))
        q.put(i)
        sleep(1)

def read(q):
    sleep(10)
    while True:
        i = q.get(True)
        print('get {}'.format(i))

if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    print('START')
    pw.start()
    pr.start()
    pw.join()
    while True:
        if q.empty():  # 如果队列中的数据都处理完了,则强制停止read方法
            pr.terminate()
            break
    print('END')
  • 信号量:Semaphore
代码语言:javascript
复制
from multiprocessing import Process, Semaphore
from time import sleep

def write(f):
    f.acquire()
    sleep(5)
    f.release()
    
    
if __name__ == '__main__':
    pp = []
    f = Semaphore(1)
    for i in range(5):
        p = Process(target=write, args=(f,))
        p.start()
        pp.append(p)
    for p in pp:
        p.join()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 程序中另起进程
    • 方法
    • 2. 进程池
    • 3. 问题:无法获取子进程的执行结果 -> 子进程
    • 4. 进程间通信
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档