python3 进程池回调函数

# coding:utf-8
import os
from multiprocessing import Pool

def func1(n):
    print("func1[%s]" % os.getpid())
    return n*n

def func2(m):
    print("func2[%s] 接收到的参数是:" % os.getpid(), m)

if __name__ == ‘__main__‘:
    print("主进程[%s]" % os.getpid())
    pool = Pool(5)
    for i in range(8):
        pool.apply_async(func1, args=(i,), callback=func2)
    pool.close()
    pool.join()

# func1[9136]
# func1[9136]
# func2[9672] 接收到的参数是: 0
# func2[9672] 接收到的参数是: 1
# func1[9136]
# func2[9672] 接收到的参数是: 4
# func1[9136]
# func2[9672] 接收到的参数是: 9
# func1[9136]
# func2[9672] 接收到的参数是: 16
# func1[9136]
# func2[9672] 接收到的参数是: 25
# func1[9136]
# func2[9672] 接收到的参数是: 36
# func1[9136]
# func2[9672] 接收到的参数是: 49

#回调函数在写的时候注意一点,回调函数的形参执行有一个,如果你的执行函数有多个返回值,那么也可以被回调
# 函数的这一个形参接收,接收的是一个元祖,包含着你执行函数的所有返回值。

使用多个进程来请求多个url来减少网络等待时间

# coding:utf-8
import os
import json
import requests
from multiprocessing import Pool

def get_url_content(url):
    print("[%s] %s" % (os.getpid(), url))
    response = requests.get(url)
    if response.status_code == 200:
        return {‘url‘: response.content.decode("utf-8")}

def write_file(dic):
    with open("request.json", "a", encoding="utf-8") as f:
        json.dump(dic, f, ensure_ascii=False)
        f.write("\n")

if __name__ == ‘__main__‘:
    url_lst = [
        ‘https://www.baidu.com‘,
        ‘https://www.python.org‘,
        ‘https://www.openstack.org‘,
        ‘https://help.github.com/‘,
        ‘http://www.sina.com.cn/‘
    ]
    pool = Pool(5)
    for url in url_lst:
        pool.apply_async(get_url_content, args=(url,), callback=write_file)
    pool.close()
    pool.join()

无需回调函数实例

# coding:utf-8
import time
from multiprocessing import Pool

def work(n):
    time.sleep(1)
    return n**2

if __name__ == ‘__main__‘:
    p = Pool()
    res_l = []
    for i in range(10):
        res = p.apply_async(work, args=(i,))
        res_l.append(res)

    p.close()
    p.join()  # 等待进程池中所有进程执行完毕
    print([re.get() for re in res_l])  # 主进程拿到所有的处理结果,可以在主进程中进行统一进行处理

# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10987310.html

时间: 2024-11-07 08:41:51

python3 进程池回调函数的相关文章

python网络编程--管道,信号量,Event,进程池,回调函数

1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享数据基于文件,而文件是硬盘上的数据) 2.需要自己加锁处理 而使用multiprocess模块为我们提供的基于消息IPC通信机制:通信和管道 可以帮我们解决这两个问题. 队列和管道都是将数据存放于内存内,而队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来来,因而队列才是进程间通信的

python3 进程池

进程池无IO堵塞的情况 # coding:utf-8 import time from multiprocessing import Process, Pool def func(n): pass if __name__ == '__main__': num = 10 start_pool_time = time.time() pool = Pool(5) pool.map(func, range(num)) # map是异步执行的,并且自带close和join print("通过进程池执行的时

python3 进程池版的socket并发聊天

Pool内的进程数默认是cpu核数,假设为4(查看方法os.cpu_count())开启6个客户端,会发现2个客户端处于等待状态在每个进程内查看pid,会发现pid使用为4个,即多个客户端公用4个进程tcp_server.py # coding:utf-8 import os import socket from multiprocessing import Pool def tcpserver(conn): while 1: from_client_msg = conn.recv(1024)

第36篇 多进程的数据共享,进程池的回调函数,线程 什么是GIL锁,Threading模块记

内容概览: 进程 数据共享 进程池--回调函数 线程 线程的基础理论 什么是线程? 线程与进程的关系 GIL锁 线程的开启: Threading模块1,用多进程开启socket创建聊天 server端写了input函数会报错?因为服务器是高速运行的,自动化的为来访问的客户端提供服务, 不可能停下来等待管理员的输入,然后发送给客户.这就失去了自动化的意义. 2,进程池Pool()方法创建的进程,map()方法是否有返回值? p.map()得到的是迭代对象 import time from mult

多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures

multiprocessing.procsess 定义一个函数 def func():pass 在if __name__=="__main__":中实例化 p = process(target=子进程要执行的函数,args(函数的参数且必须以元组的方式传参)) p.start() 开启子进程 p.join() 感知子进程的结束,主进程等待子进程执行完后才退出 p.terminate() 结束一个子进程 p.is_alive() 查看某个进程是否还在运行 属性 p.name p.pid

同步异步 + 回调函数

重点记忆 异步回调函数 如果进程池+回调: 回调函数由主进程去执行. 如果线程池+回调: 回到函数由空闲的线程去执行.(比如有4个线程,10个任务,第一轮完成4个任务,交由主线程处理结果,第二轮同样如此,但是第三轮将会空闲出2个子进程,则这2个子进程将会和主进程一同处理结果,以此类推,当所有的任务完成时,所有的子进程和主进程一起处理结果,增加效率) 回调函数不管有没有返回数据,返回值都是None,回调函数内部加函数名是调用此函数,obj隐形传参 1.概念 1. 从执行的角度 阻塞: 程序运行时,

python_高级进阶(4)同步_异步_回调函数_阻塞

阻塞 阻塞: 程序运行时,遇到了IO,程序挂起,cpu被切走. 非阻塞 非阻塞: 程序没有遇到IO,程序遇到IO但是我通过某种手段,让cpu强行运行我的程序. ? #同步: 提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我在提交下一个#? #异步: 一次提交多个任务,然后我就直接执行下一行代码. 收取结果 : 1将所有的任务的结果统一回收. 2. 完成一个任务,返回一个结果. 给三个人发布任务: 同步: 先告知第一个人完成写书的任务,我从原地等待,等他两天之后完成

协程,事件,队列,同步,异步,回调函数

协程 什么是协成?单个线程并发的处理多个任务,程序控制协成的切换+保持状态,协成的切换速度非常快,蒙蔽了操作系统的眼睛,让操作系统认为CPU一直在运行 进程或线程都是由操作系统控制CPU来回切换,遇到阻塞就切换执行其他任务,协成是程序控制的,霸占CPU执行任务,会在操作系统控制CPU之前来回切换,操作系统就认为CPU一直在运作 协程的优点: 1.开销小 2.运行速度快 3.协程会长期霸占CPU只执行我程序里的所有任务 协程的缺点: 1.协程属于微并发,处理任务不易过多 2.协程的本质是单线程,无

同步异步与回调函数

同步异步 1,同步 同步是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那个这个进程会一直等待下去,直到收到返回信息,才继续执行下去 from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import os, random def task(i): print(f'{os.getpid()}开始了任务') time.sleep(random.randint(1,3)) print(f'{o