这是一个新手问题:
一个类是一个对象,所以我可以创建一个名为pippo()
的类,在这个add函数和参数中,我不明白pippo
里面的函数是否从最高处执行当我分配x=pippo()
时,或者我必须在x.dosomething()
之外将其称为pippo
。
使用Python的多处理包,最好是在调用target
时使用Process()
参数定义一个大函数并创建对象,或者通过继承自{来创建自己的进程类{1}}上课?
答案 0 :(得分:30)
我经常想知道为什么Python multiprocessing上的文档页面只显示“功能”方法(使用target
参数)。可能是因为简洁,简洁的代码片段最适合用于说明目的。对于适合一个函数的小任务,我可以看到这是首选方式,ala:
from multiprocessing import Process
def f():
print('hello')
p = Process(target=f)
p.start()
p.join()
但是当你需要更多的代码组织(对于复杂的任务)时,你可以自己创建一个类:
from multiprocessing import Process
class P(Process):
def __init__(self):
super(P, self).__init__()
def run(self):
print('hello')
p = P()
p.start()
p.join()
请记住,每个生成的进程都使用主进程的内存占用的副本进行初始化。并且构造函数代码(即__init__()
中的内容)在主进程中执行 - 只有run()
内的代码在单独的进程中执行。
因此,如果进程(主进程或衍生进程)更改了其成员变量,则更改将不会反映在其他进程中。当然,这仅适用于内置类型,例如bool
,string
,list
等。但是,您可以从multiprocessing
导入“特殊”数据结构然后在进程之间透明地共享模块(参见Sharing state between processes。)或者,您可以创建自己的IPC(进程间通信)通道,例如multiprocessing.Pipe
和multiprocessing.Queue
。