美文网首页
并发编程-进程池和multiprocess.Pool

并发编程-进程池和multiprocess.Pool

作者: Yanl__ | 来源:发表于2019-10-28 20:33 被阅读0次

multiprocess.Pool模块

  • Pool([numprocess [,initializer [, initargs]]]):

1 numprocess:要创建的进程数,如果省略,将默认使用cpu_count()的值 (一般设置为cpu个数+1)
2 initializer:是每个工作进程启动时要执行的可调用对象,默认为None
3 initargs:是要传给initializer的参数组

  • p.apply(func [, args [, kwargs]]):在一个池工作进程中执行func(args,*kwargs),然后返回结果。
    ret = p.apply(func, args=()) 返回值就是func的return
    '''需要强调的是:此操作并不会在所有池工作进程中并执行func函数。如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async()'''

  • p.apply_async(func [, args [, kwargs]]):在一个池工作进程中执行func(args,*kwargs),然后返回结果。

  1. 返回值:ret = apply_async返回的对象,让用户可以通过ret.get()获得func的返回值。get会阻塞直到对应的func执行完毕拿到结果。
  2. 使用apply_async给进程池分配任务,需要先close后join来保持多进程和主进程代码的同步性
  • p.close():关闭进程池,防止进一步操作。如果所有操作持续挂起,它们将在工作进程终止前完成

  • p.join():等待所有工作进程退出。此方法只能在close()或teminate()之后调用

进程池的同步调用

# -*- coding: UTF-8 -*-

"""
# @Time    : 2019-10-23 17:02
# @Author  : yanlei
# @FileName: 进程池的同步调用.py
"""
import os, time
from multiprocessing import Pool

def work(n):
    print('%s run'%os.getpid())
    time.sleep(1)
    return n**2

p = Pool(3)
res_l = []
for i in range(10):
    res = p.apply(work, args=(i, )) # 同步调用,直到本次任务执行完毕拿到res,等待任务work执行的过程中可能有阻塞也可能没有阻塞
    res_l.append(res)
print(res_l)

进程池的异步调用

import os, time
from multiprocessing import Pool

def work(n):
    print('%s run'%os.getpid())
    time.sleep(1)
    return n**2

p = Pool(3)
ret_l = []
for i in range(10):
    ret = p.apply_async(work, args=(i, )) #  异步调用
    ret_l.append(ret)
p.close()
p.join()
for ret in ret_l:
    print(ret.get())

进程池版socket并发聊天

server端

  • 进程池开几个进程,就能同时和几个客户端聊天。其他的需要在后面排队等待前面的进程结束归还进程池才能拿到。
import os
from socket import *
from multiprocessing import Pool

server = socket(AF_INET, SOCK_STREAM)
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8080))
server.listen(5)

def talk(conn):
    print('进程pid:%s'%os.getpid())
    while True:
        try:
            msg = conn.recv(1024)
            if not msg:break
            print(msg.decode('utf-8'))
            conn.send(msg.upper())
        except Exception:
            break

p = Pool(4)
while True:
    conn, *_ = server.accept()
    p.apply_async(talk, args=(conn, ))

client端

from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8080))

while True:
    msg = input('>>>').strip()
    if not msg:break

    client.send(msg.encode('utf-8'))
    msg = client.recv(1024)
    print(msg.decode('utf-8'))

回调函数

p.apply_async(get_data, args=(url, ), callback=call_back)

# -*- coding: UTF-8 -*-

"""
# @Author  : yanlei
# @FileName: 回调函数_爬取数据.py
"""
import requests
from multiprocessing import Pool

def get_data(url):
    response = requests.get(url)
    if response.status_code == 200:
        return url, response.content.decode('utf-8')

def call_back(args):
    url, content = args
    print(url, len(content))

url_list = [
    'https://www.baidu.com',
    'https://www.sohu.com',
    'https://www.sogou.com',
    'https://www.runoob.com',
    'https://leetcode-cn.com',
    'https://cn.bing.com',
]

p = Pool(2)
for url in url_list:
    p.apply_async(get_data, args=(url, ), callback=call_back)
p.close()
p.join()



相关文章

  • 并发编程-进程池和multiprocess.Pool

    multiprocess.Pool模块 Pool([numprocess [,initializer [, ini...

  • 并发编程

    并发编程三种构造并发程序的方式:基于进程的并发编程、基于IO多路复用的并发编程、基于线程的并发编程1、 基于进程...

  • PHP并发IO编程之路

    并发IO问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接Fork进程,到Worker进程池/线程池,到现在...

  • Python 并发编程之线程池/进程池

    引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程...

  • Python并发编程之线程池/进程池

    原文来自开源中国 前言 python标准库提供线程和多处理模块来编写相应的多线程/多进程代码,但当项目达到一定规模...

  • java并发编程之背景知识

    本文为学习java并发编程的学习笔记。交流心得。 想要了解java并发编程,首先要了解进程和线程的关系。 进程的概...

  • Python 并发编程简介

    1 多线程和多进程 Python语言中既有多线程编程也有多进程编程,也叫做并发编程。 多进程 把一个程序分成几个不...

  • GO学习笔记(18) - 并发编程(1) - 理解gorouti

    目录 进程、线程与协程 并发模模型介绍 GO并发编程介绍 进程、线程与协程 进程和线程 进程是程序在操作系统中的一...

  • JUC并发编程学习笔记

    JUC(并发编程),java.util.concurrent得工具类 首先得了解进程和线程得关系和区别:进程:进程...

  • Gevent高并发网络库精解

    进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在python...

网友评论

      本文标题:并发编程-进程池和multiprocess.Pool

      本文链接:https://www.haomeiwen.com/subject/yrwhvctx.html