在写多进程的时候我发现一个问题,用Pool的apply_async(异步非阻塞)的时候传入实例函数会出错,或者说是子进程被跳过似的感觉(python2.7)。

但是用python3.7的话没有任何问题。

code:

# -*- coding:utf-8 -*-

import multiprocessing
import os
import time class A(object):
def __init__(self):
pass @staticmethod
def func(msg):
print(msg)
time.sleep(3)
print('Child Process id : %s, Parent Process id : %s' % (os.getpid(), os.getppid())) if __name__ == '__main__':
a = A()
p = multiprocessing.Pool(multiprocessing.cpu_count())
for i in range(5):
p.apply_async(a.func, args=(i,))
p.close()
p.join()
print('Parent process done!')

output(python2.7):

Parent process done!

output(python3.7):

0
1
2
3
Child Process id : 17284, Parent Process id : 22536
4
Child Process id : 4252, Parent Process id : 22536
Child Process id : 4944, Parent Process id : 22536
Child Process id : 11168, Parent Process id : 22536
Child Process id : 17284, Parent Process id : 22536
Parent process done!

python3.7起实例函数的多线程时需要注意一个地方,主进程中的变量不会受到子进程的改变而改变。

简而言之就是进程之间不能共享变量。

code:

# -*- coding:utf-8 -*-

from multiprocessing import Pool
import os
import time class AA(object):
def __init__(self):
print('init')
self.ab = 3 def task(self, n):
self.ab += n
print("进程(%s), 收到%s, +n=%s" % (os.getpid(), n, self.ab)) if __name__ == '__main__':
aa = AA()
p = Pool(4) for i in range(5):
t = p.apply_async(func=aa.task, args=(i,)) p.close()
p.join()
print("done ! 主进程!aa.ab=%s" % aa.ab)
print("主进程ID %s " % os.getpid())

output:

init
子进程(7544), 收到0, +n=0
子进程(7544), 收到1, +n=1
子进程(7544), 收到2, +n=2
子进程(7544), 收到3, +n=3
子进程(7544), 收到4, +n=4
done ! 主进程!aa.ab=3
主进程ID 17256

-----------------------------手动分割----------------------------------

不知道为什么所有子进程的id是一样的。在task方法中如果加个sleep语句的话,如time.sleep(3),

那么子进程的id就是不同的,难道是因为执行的太快??欢迎知道的大咖在评论区告知一下小弟,谢谢!

python 进程池Pool的apply_async方法以及一些需要注意的地方的更多相关文章

  1. python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...

  2. python 进程池的简单使用方法

    回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from ...

  3. python 进程池Pool以及Queue的用法

    import os,time,random from multiprocessing import Pool def task(name): print('正在运行的任务:%s,PID:(%s)'%( ...

  4. Python进程池Pool

    ''' 进程池,启动一个进程就要克隆一份数据,假设父进程1G,那么启动进程开销很大 避免启动太多造成系统瘫痪,就有进程池,即同一时间允许的进程数量 ps:线程没有池,因为线程启动开销小,线程有类似信号 ...

  5. python 进程池pool

    进程池子 当你成千上万的业务需要创建成千上万的进程时,我们可以提前定义一个进程池 from multiprocessing import Pool p = Pool(10) #进程池创建方式,类似空任 ...

  6. python进程池pool的starmap的使用

    #!/usr/bin/env python3 from functools import partial from itertools import repeat from multiprocessi ...

  7. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

  8. 万里长征第一步:Python进程池的一点点小坑

    # -*- coding: utf- -*- """ Created on Thu Mar :: @author: lilide """ # ...

  9. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

随机推荐

  1. jenkins 配置

    配置: echo " aliyun.oss.access.key=LTAIz4Koeff8sCr8 " > ./src/main/resources/oss.dev.prop ...

  2. PTA编程总结2—币值转换

    7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成"贰万叁仟壹百零捌"元.为了简 ...

  3. 20165306 Exp1 PC平台逆向破解

    20165306 Exp1 PC平台逆向破解 一.逆向及Bof基础实践说明 1. 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,fo ...

  4. 开发者中心没有勾选 ipad却需要传宣传图片的解决方法

    1.通过模拟器 运行一个ipad 把ipad的比例调到100% 然后保存图片,如果没有适配ipad会出现上下左右黑色边框,这些不必在意,把保存的图片拖到开发者中心即可,勾选右侧 ,都使用12.9英寸图 ...

  5. If嵌套

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Kotlin 扩展

    Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式. 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响. 扩展函数 扩展函数可以在已有类中添加新的方法 ...

  7. 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面

    Ocelot   路由  请求聚合  服务发现 认证  鉴权 限流熔断 内置负载均衡器 Consul   自动服务发现    健康检查 通过Ocelot搭建API网关   服务注册   负载均衡 1. ...

  8. element-UI表单验证

    转载自: 一.简单逻辑验证(直接使用rules) 实现思路 •html中给el-form增加 :rules="rules"•html中在el-form-item 中增加属性 pro ...

  9. 常见adb指令

    1. adb –-help 查看帮助文档 2. adb start-server 当adb没有启动或被手动杀掉时,可以使用该命令启动服务 3. adb kill-server 杀死adb服务 4. a ...

  10. Asp.net core Identity + identity server + angular 学习笔记 (第三篇)

    register -> login 讲了 我们来讲讲 forgot password -> reset password  和 change password 吧 先来 forgot pa ...