首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么multiprocessing.Process不能从对象实例中调用方法?我不能理解那个泡菜问题

multiprocessing.Process不能从对象实例中调用方法的原因是因为在多进程环境中,每个进程都有自己独立的内存空间,无法直接共享对象实例。当使用multiprocessing模块创建子进程时,会将对象实例进行序列化并传递给子进程,子进程会在自己的内存空间中重新创建一个相同的对象实例。

由于对象实例在子进程中是重新创建的,所以无法直接调用原始对象实例中的方法。如果需要在子进程中调用方法,可以通过将方法定义在顶层模块中,或者使用类方法或静态方法来实现。

对于泡菜问题,你提到的问题不太清楚,请提供更多细节或者明确问题,我将尽力帮助你解答。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python多进程multiprocessing、进程池用法实例分析

本文实例讲述了Python多进程multiprocessing、进程池用法。...: python的多进程需要使用multiprocessing模块 多进程的创建与运行: 1.进程的创建:进程对象=multiprocessing.Process(target=函数名,args=(参数...,))【补充,由于args是一个元组,单个参数时要加“,”】 2.进程的运行: 进程对象.start() 进程的join跟线程的join一样,意义是 “阻塞当前进程,直到调用join方法那个进程执行完...进程对象.terminate():结束进程【建议的方法,现实少用】 进程池: 为什么需要进程池 如果要启动大量的子进程,可以用进程池的方式批量创建子进程,而进程池可以限制运行的进程的数量【有太多人想要游泳...注:对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。

1.2K20

并行执行(二)、multiprocessing

从结果可以看出,并发执行的时间明显比顺序执行要快很多,但是进程是要耗资源的,所以平时工作,进程数也不能开太大。...对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了。...在总结这些潜在的犯错的可能的同时,我们会简单看一下mp当中Queue的实现方式,以便能够方便的理解为什么会有这样的行为。...这些实现问题仅仅针对Linux,Windows上面的实现和出现的问题在这里涉及。...不幸的是,这个方法不是正确的获取Queue的方式,原因正如上一篇文章所说,SyncManager.Queue方法的每次调用获取到的是一个新建对象的代理对象,而不是一个共享对象

51620
  • Python进程学习

    ,不等待进程返回结果 p.name()    输出p进程的名字 p.pid()    输出p进程的pid是多少 p.start()    开始p进程,与run()方法相同 Python的os模块封装了常见的系统调用...创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样创建进程比fork()还要简单。...代码解读: 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。...请注意输出的结果,task 0,1,2,3是立刻执行的,而task 4要等待前面某个task完成后才执行,这是因为Pool的默认大小在的电脑上是4,因此,最多同时执行4个进程。...由于Windows没有fork调用,因此,multiprocessing需要“模拟”出fork的效果,父进程所有Python对象都必须通过pickle序列化再传到子进程去,所有,如果multiprocessing

    53420

    2018年8月25日多进程编程总结

    创建进程时参数的处理: 1.基于函数创建的进程,如果有参数的话直接在定义函数的时候将形参写在函数名后边的括号, 当调用函数的时候,直接把参数一起写进去,实例: def my_proc2(name...):     print(name, "是一个独立的进程:程序的进程编号:", os.getpid(), os.getppid()) p11 = multiprocessing.Process(target...,每个进程全局变量的数据都是互相独立的 在多进程并发处理的情况下如果用设置全局变量或者是传递参数的方式,并不能让数据被多个进程共享 函数执行并发操作时,每个进程都会单独拷贝一份当前进程的变量数据进行独立使用而互相影响...args 并执行函数 func,该方法不会形成阻塞 func,           函数执行完成之后可以通过结果对象的 get()方法获取结果 args,           如果结果对象可用时会自动调用...: 多进程的面向对象的实现方式类似多线程的操作模式 自定义进程类型,继承系统进程标准类型 multiprocessing.Process 重写父类的 run()方法,在方法定义执行代码 在使用时创建该自定义进程类型的对象

    60350

    程序员面试的标准答案并不标准

    的意思是: 有这样一个简单的问题:一个类的静态方法不能调用同一个类的非静态方法?如果你稍微懂点Java,你知道答案是:no,不能。静态方法属于类,而不属于实例。...你甚至可以直接使用类的名称执行静态方法,而不需要任何类的实例。甚至在整个JVM没有类的一个实例,它也可以运行。因此,哪里能够调用一个运行连接到实例的普通方法?...狂妄自大的家伙,没有理由认为静态方法不能调用实例方法,好不好。...这里Peter的问题基于这样一个事实,静态方法没有特定对象的引用(通常是“this”引用),这是给出的答案的理由:“没有this,没有方法调用”。...他甚至开始解释这样的情况可能发生在静态方法访问实例的时候。它可能会得到一个实例作为方法参数,并且通过那个引用,它可以调用实例方法。他说的是对的。

    58770

    程序员面试的标准答案并不标准

    的意思是: 有这样一个简单的问题:一个类的静态方法不能调用同一个类的非静态方法?如果你稍微懂点Java,你知道答案是:no,不能。静态方法属于类,而不属于实例。...你甚至可以直接使用类的名称执行静态方法,而不需要任何类的实例。甚至在整个JVM没有类的一个实例,它也可以运行。因此,哪里能够调用一个运行连接到实例的普通方法?...狂妄自大的家伙,没有理由认为静态方法不能调用实例方法,好不好。...他甚至开始解释这样的情况可能发生在静态方法访问实例的时候。它可能会得到一个实例作为方法参数,并且通过那个引用,它可以调用实例方法。他说的是对的。...按照原意的话,“age”字段是不能从其他地方访问的,是? 不过,的回答是:“当然可以。你只需要将对象实例转换成void指针(void*),然后从对象的开始位置计算偏移量,这样就可以访问到它了。”

    29010

    见过的最糟糕的程序代码

    这个程序出了点问题,公司派了一个去修复这个问题,等他回来后发现精神有点反常,不是哭就是笑,嘴里嘟囔着什么“匹萨调用汉堡并且传入了包子”。...但是,你需要想像一下:程序的所有函数、变量名都是以食物命名的。匹萨,西红柿,泡菜,各种味道的奶酪,水果,蔬菜,酒,等等,一篇一篇,全是这样。...里面唯一能让你马上知道意义的地方只有‘main’函数名和C标准类库的调用。 就这样,接手了这个费力讨好的烂摊子,努力的把程序恢复到一个可维护的状态。...另外一个问题是,代码写的太烂,事实上,这意大利面条式的代码比这些毫无意义的符号更让人困惑,等我把函数名和变量名都改回有意义的名称后,开始把一大堆的代码重写,让它们易于理解、效率更高。...始终没有弄明白他是否还有一套没有加密混淆过的代码,他可以使用一些‘混淆’脚本通过替换的方法把原始变量名混淆成这样。

    66950

    一点一滴探究JVM之内存结构

    前言 一直尝试着用不一样的文字来写博客!原因很简单,你讲的知识书上都有,那么每个人为什么选择看书而选择看你的博文来学习呢?...清楚你的对象会被分配在哪里(不绝对) 理解哪些区域对线程来说是私有区,哪些区域是线程共享区域 知道方法调用发生了什么? … 等等等,你可能还会解释你以前遇到一些匪夷所思的问题!...,后面介绍)该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程的动态连接。...所以,Java Heap存储了这个实例对象!...对了,作为补充,想你还需要知道, obj引用怎么你能访问到Java Heap区的那个实例对象 有两种方式,一种使用过句柄指针(学过c/c++对这些概念应该会很熟悉) 还有一种就是通过指针直接访问

    1.4K00

    Python进程间通信multiprocess代码实例

    之所以叫multi是取自multiple的多功能的意思,在这个包几乎包含了和进程有关的所有子模块。...由于提供的子模块非常多,为了方便大家归类记忆,将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。...重点强调:进程没有任何共享状态,进程修改的数据,改动仅限于该进程内,但是通过一些特殊的方法,可以实现进程之间数据的共享。...有了之前多线程使用以及线程间queue的基础,多进程以及进程间通信就很好理解了,下面是多进程基本语法以及进程间通信简单示例 #多进程基本语法 import multiprocessing, time,...,多个对象必须使用列表 元组 字典等传递 if __name__ == '__main__': q = multiprocessing.Queue() #主进程实例化一个进程queue process2

    65731

    多任务编程 - 1

    比如:现实生活的公司可以理解成是一个进程,公司提供办公资源(电脑、办公桌椅等),真正干活的是员工,员工可以理解为线程。...]) group:指定进程组,目前只能使用None target:执行的目标任务名 name:进程名字 args:以元组方式给执行任务传参 kwargs:以字典方式给执行任务传参 Process创建的实例对象的常用方法...: start():启动子进程实例(创建子进程) join():等待子进程执行结束 terminate():不管任务是否完成,立即终止子进程 Process创建的实例对象的常用属性: name:当进程的别名...dance", os.getpid()) # 获取当前进程 print("dance", multiprocessing.current_process()) # 获取当前进程对象...: 李明辉 # @File : ithui_进程之间共享全局变量.py # @Software : PyCharm import multiprocessing import time # 定义全局变量

    44710

    python基础篇大合集,进程、装饰器、列表详解篇!

    ,这个对象可以理解为是一个独立的进程,可以执行另外的事情 1....group:指定进程组,大多数情况下用不到 Process创建的实例对象的常用方法: start():启动子进程实例(创建子进程) is_alive():判断进程子进程是否还在活着 join([timeout...进程在执行过程拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率 线程不能够独立执行,必须依存在进程 可以将进程理解为工厂的一条流水线,而其中的线程就是这个流水线上的工人 优缺点...开闭原则: 在不修改原函数及其调用方式的情况下对原函数功能进行扩展 对代码的修改是封闭 不能修改被装饰的函数的源代码 不能修改被装饰的函数的调用方式 用函数的方式设想一下游戏里用枪的场景 1 def...定义返回值了return '游戏展示完毕',却没给返回 装饰器的返回值 1 为什么定义了返回值,但是返回值还是None呢,是因为即使在game函数定义了return '游戏展示完毕' 2 但是装饰器里只有一个

    1.1K20

    Python的多处理与多线程:新手简介

    为什么想要它? Python是一种线性语言。但是,当您需要更多的处理能力时,线程模块就派上用场了。 Python的线程不能用于并行CPU计算。...线程包含在标准库: import threading from queueimport Queue import time 您可以使用target作为可调用对象,args将参数传递给函数,并开始启动线程...理解使用所有这些工具的利弊是很重要的。 例如: 管理线程需要时间,因此它适用于基本任务(如示例) 线程化增加了程序的复杂性,从而增加了调试的难度 多处理是什么?它与线程有什么不同?...因此GIL是必要的,因为Python不是线程安全的,而且在访问Python对象时存在一个全局强制锁。虽然不完美,但它是一种非常有效的内存管理机制。...因此,与线程相关的常见问题(如数据损坏和死锁)不再是问题。因为进程共享内存,所以它们不能并发地修改相同的内存。

    30620

    Ysoserial CommonsColletions2 两个问题

    1)queue为什么要先用两个1占位; 2)PriorityQueue的queue 已经使用transient关键字修饰,为什么能从反序列化queue的元素(参见CommonsCollections2...即:承载执行命令的;承载;对队列元素排序调用方法触发。 不知道作者 为什么要复杂化。当然,一方面可能存在某些局限没有发现;另一方面,更复杂的链的确需要更深的功底,不得不佩服。...8)回头看5),InvokerTransformer的transform方法将会被调用 再接着看defineTransletClasses 12)对象实例化,触发命令执行 获取到对象的字节码之后...0x03 问题解答 1)queue为什么要先用两个1占位? 实话说,其实也不知道。但是最初的说法(比较器要求元素类型一致,payload这么构造是为了防止序列化过程出现异常)肯定不严谨。...2)PriorityQueue的queue 已经使用transient关键字修饰,为什么能从反序列化queue的元素?

    75890

    Java 多态的实现机制

    ,而程序调用方法在运行期才动态绑定,就是引用变量所指向的具体实现对象方法,也就是内存里正在运行的那个对象方法,而不是引用变量的类型定义的方法。...浅谈多态机制的意义及实现 在面向对象编程(Object-Oriented Programming, OOP),多态机制无疑是其最具特色的功能,甚至可以说,运用多态的编程不能称之为OOP。...这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事。...注意这里只有非私有的实例方法才会出现,并且静态方法也不会出现在这里,原因很容易理解:静态方法对象无关,可以将方法地址直接引用,而不像实例方法需要间接引用。...而对于A来说,它的方法的method方法则会指向其自身的method方法而非其父类的(这在类加载器载入该类时已经保证,同时JVM会保证总是能从对象引用指向正确的类型信息)。

    63210

    一篇文章梳理清楚 Python 多线程与多进程

    实例方法: start():启动进程,并调用该子进程的p.run() run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 terminate():...此方法的结果是AsyncResult类的实例,callback是可调用对象,接收输入参数。当func的结果变为可用时,将理解传递给callback。...,并在该子进程启动管理器服务器 get_server():获取服务器对象 connect():连接管理器对象 shutdown():关闭管理器对象,只能在调用了start()方法之后调用 实例属性:...submit()方法 Executor定义了submit()方法,这个方法的作用是提交一个可执行的回调task,并返回一个future实例。future对象代表的就是给定的调用。...如果调用当前正在执行,并且不能被取消,那么该方法将返回False,否则调用将被取消,方法将返回True。 cancelled():如果成功取消调用,返回True。

    75110

    面试官:谈谈你对 this 指向的理解

    其实也不是,只是一开始说的不准确,接下来将补充一句话,相信你就可以彻底的理解this的指向的问题。...情况1:如果一个函数中有this,但是它没有被上一级的对象调用,那么this指向的就是window,这里需要说明的是在js的严格版this指向的不是window,但是我们这里探讨严格版的问题,你想了解可以自行上网查找...如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。...还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊。...首先new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。

    69110

    Python多进程编程

    Process 创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),target表示调用对象,args表示调用对象的位置参数元组...kwargs表示调用对象的字典。name为别名。group实质上不使用。 方法:is_alive()、join([timeout])、run()、start()、terminate()。...put方法用以插入数据到队列,put方法还有两个可选参 数:blocked和timeout。...send和recv方法分别是发送和接受消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。...执行说明:创建一个进程池pool,并设定进程的数量为3,xrange(4)会相继产生四个对象[0, 1, 2, 4],四个对象被提交到pool,因pool指定进程数为3,所以0、1、2会直接送到进程执行

    1.1K50

    (数据科学学习手札70)面向数据科学的Python多进程简介及应用

    ,接着利用Process()将一个进程实例化,其主要参数如下: target: 需要执行的运算函数 args: target函数对应的传入参数,元组形式传入   在process创建完成之后,我们对其调用...,再接着用循环的方式将所有进程逐个激活,最后使用到.join()方法,这个方法用于控制进程之间的并行,如下例: join_demo.py import multiprocessing import...图2 multi_processes.py运行结果   观察对应进程执行的开始结束时间信息可以发现,一个进程对象在.start()之后,若在其他的进程对象.start()之前调用.join()方法,则必须等到先前的进程对象运行结束才会接着执行....join()之后的非.join()的内容,即前面的进程阻塞了后续的进程,这种情况下并不能实现并行的多进程,要想实现真正的并行,需要现行对多个进程执行.start(),接着再对这些进程对象执行.join...()函数将传入的函数以串行的方式作用到传入的序列每一个元素之上,而Pool()的.map()方法则根据前面传入的并行数量5,以多进程并行的方式执行,大大提升了运算效率。

    44310

    Python 多进程学习总结

    创建进程的类 Process multiprocessing 模块提供了一个创建进程的类 Process ,其创建进程有两种方法:第一一种方法是创建一个 Process 类的实例,并指定目标任务函数;第二种方法是自定义一个类...args 表示调用对象的位置参数元组。 kwargs 表示调用对象的字典。 name 为进程的别名。 group 参数不使用,可忽略。...使用锁也非常简单,首先初始化一个锁的实例lock = multiprocessing.Lock(),然后在需要独占的代码前后加锁:先获取锁,即调用lock.acquire()方法,运行完成后释放锁,即调用...主进程调用事件的set()方法唤醒等待事件的进程,事件唤醒后调用clear()方法清除事件的状态,并重新等待,以此达到进程同步的控制,执行结果如下所示: 20:47:27 主进程: 谁等我下,需要 8...Pipe()方法返回的对象具有发送消息 send()方法和接收消息 recv()方法,可以调用 Command1 . send( msg )发送消息, Command2 . recv()接收消息。

    49830
    领券