博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
40 进程池 回调函数 线程 thrrading模块
阅读量:4462 次
发布时间:2019-06-08

本文共 3378 字,大约阅读时间需要 11 分钟。

异步的 apply_async

# 1.如果是异步的提交任务,那么任务提交之后进程池和主进程也异步了,
    #主进程不会自动等待进程池中的任务执行完毕
# 2.如果需要主进程等待,需要p.join
    # 但是join的行为是依赖close
# 3.如果这个函数是有返回值的
    # 也可以通过ret.get()来获取返回值
    # 但是如果一边提交一遍获取返回值会让程序变成同步的
    # 所以要想保留异步的效果,应该讲返回对象保存在列表里,所有任务提交完成之后再来取结果
    # 这种方式也可以去掉join,来完成主进程的阻塞

同步请求的

import osimport timefrom multiprocessing import Pool# 同步请求的# def wahaha():#     time.sleep(1)#     print(os.getpid())#     return True## if __name__ == '__main__':#     p = Pool(5)  # CPU的个数 或者 +1#     ret_l = []#     for i in range(20):#        ret = p.apply(func = wahaha)   # 同步的,不用#        print(ret)
View Code

异步请求的

ef wahaha():    time.sleep(1)    print(os.getpid())if __name__ == '__main__':    p = Pool(5)  # CPU的个数 或者 +1    ret_l = []    for i in range(20):       ret = p.apply_async(func = wahaha) # async  异步的       ret_l.append(ret)    p.close()  # 关闭 进程池中的进程不工作了               # 而是关闭了进程池,让任务不能再继续提交了    p.join()   # 等待这个池中提交的任务都执行完    # # 表示等待所有子进程中的代码都执行完 主进程才结束
View Code

# 异步提交,获取返回值,等待所有任务都执行完毕之后再统一获取结果

def wahaha():    time.sleep(1)    print(os.getpid())    return Trueif __name__ == '__main__':    p = Pool(5)  # CPU的个数 或者 +1    ret_l = []    for i in range(20):       ret = p.apply_async(func = wahaha) # async  异步的       ret_l.append(ret)    p.close()  # 关闭 进程池中的进程不工作了               # 而是关闭了进程池,让任务不能再继续提交了    p.join()   # 等待这个池中提交的任务都执行完    for ret in ret_l:        print(ret.get())
View Code

异步提交,获取返回值,一个任务执行完毕之后就可以获取到一个结果(顺序是按照提交任务的顺序)

def wahaha():    time.sleep(1)    print(os.getpid())    return Trueif __name__ == '__main__':    p = Pool(5)  # CPU的个数 或者 +1    ret_l = []    for i in range(20):       ret = p.apply_async(func = wahaha) # async  异步的       ret_l.append(ret)    for ret in ret_l:        print(ret.get())
View Code

2  回调函数    _ 在主进程中执行

在发起任务的时候 指定callback参数

在每个进程执行完apply_async任务之后,返回值会直接作为参数传递给callback的函数,执行callback函数中的代码

等待池中的任务执行完毕

import osimport timeimport randomfrom multiprocessing import Pooldef wahaha(num):    time.sleep(random.random())    print('pid : ',os.getpid(),num)    return numdef back(arg):    print('call_back : ',os.getpid(),arg)if __name__ == '__main__':    print('主进程',os.getpid())    p = Pool(5)  # CPU的个数 或者 +1    for i in range(20):       ret = p.apply_async(func = wahaha,args=(i,),callback=back) # async  异步的    p.close()    p.join()
View Code

3  进程的总结

# 进程

# 进程三状态
# 同步异步阻塞非阻塞
    # 请解释异步非阻塞
    # 给开发完成的所有装饰器+log
# 是计算机中最小的资源分配单位
# 进程的创建 Process
# 进程之间的异步 本身子进程主进程之间都是异步的
# 进程之间的同步控制 Lock Semaphore Event
# 进程之间的数据隔离 本身进程与进程之间都是数据隔离的
# 进程之间通信 IPC 管道 队列
# 数据共享 Manager
# 进程池 -可以获取返回值
    # 同步调用 - 基本不用的
    # 异步调用 - 重要的
        # apply_async
        # get获取结果
        # close
        # join
    # 回调函数 Pool 回调函数在主进程中执行
        # apply_async(func = wahaha,callback = back)

 

4 线程的概念

# 进程
# 是计算机中最小的资源分配单位
# 在利用多个CPU执行的过程中,对多个程序的资源进行管理和隔离
# 进程的弊端
# 开启和关闭 以及 切换 都会带来很大的时间开销
# 过多的进程还会造成操作系统调度的压力
# 线程
# 线程是CPU调度的最小单位
# 每个进程中至少有一个线程
# 实际上执行代码的是线程
# 线程属于进程
# 进程负责获取操作系统分配给我的资源
# 线程负责执行代码
# 从代码的角度上来看
    # 多进程
        # 开启和结束 时间开销大
        # 切换的效率低
        # 内存隔离
    # 多线程
        # 开启和结束 时间开销非常小
        # 切换效率高
        # 内存不隔离
# Cpython解释器下的全局解释器锁
    # 在同一个进程中的多个线程在同一时刻只能有一个线程访问CPU
    # 多线程无法形成并行
    # 锁的线程
# 什么时候才会有到CPU
    # 程序计算的时候
# IO阻塞
    # 是不会用到CPU的
# Jpython解释器就没有全局解释器锁
# pypy解释没有全局解释器锁
# 4cpu
# 起四个进程
    # 进程里起线程
 
5threading  模块
import osimport timefrom threading import Threaddef func():    time.sleep(1)    print(123,os.getpid())print(123,os.getpid())for  i in range(10):    # func()    Thread(target=func).start()
View Code

 

转载于:https://www.cnblogs.com/daien522556/p/9379372.html

你可能感兴趣的文章
基于块流协议保证音频优先发送
查看>>
关于互联网的一些数据
查看>>
数据预处理:独热编码(One-Hot Encoding)
查看>>
python将对象名的字符串类型,转化为相应对象的操作方法
查看>>
【NLP新闻-2013.06.03】New Book Where Humans Meet Machines
查看>>
mongodb安装4.0(rpm)
查看>>
DispatcherServlet的url mapping为“/”时,对根路径访问的处理
查看>>
备忘pwnable.kr 之passcode
查看>>
好久没敲代码了,手有点生——一个小小的时钟
查看>>
运算符 AS和IS 的区别
查看>>
(转)详解C中volatile关键字
查看>>
easyui时的时间格式yyyy-MM-dd与yyyy-MM-ddd HH:mm:ss
查看>>
专题:动态内存分配----基础概念篇
查看>>
Codeforces Round #426 (Div. 2) (A B C)
查看>>
The Most Simple Introduction to Hypothesis Testing
查看>>
UVA10791
查看>>
P2664 树上游戏
查看>>
jQuery 停止动画
查看>>
Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
查看>>
教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
查看>>