今天我写了这篇文章Multiprocessing Error with Results。
现在我将此脚本修改为:
import multiprocessing
class class1():
def classfunction1(self, a):
self.x = a
print("class 1")
class class2():
def classfunction2(self, a):
self.y = a
print("class 2")
def test(i):
print("I'm in the Testfunction")
b = i * class1.x * class2.y
return b
def init(): # added
print("I'm in the Initfunction")
global class1, class2
class1 = class1()
class2 = class2()
x = 1
y = 2
class1.classfunction1(x)
class2.classfunction2(y)
if __name__ == "__main__":
init() # explicit call here
print("This variable is callable", class1.x)
print("And this one is also callable", class2.y)
counter = []
for i in range(10):
counter.append(i)
pool = multiprocessing.Pool(initializer=init, processes=4) # implicit call
results = pool.imap(test, counter)
pool.close()
pool.join()
resultslist = list(results)
print(resultslist)
我在类中插入了一些print-commands。但结果是无结构打印,如下所示:
I'm in the Initfunction
class 1
class 2
This variable is callable 1
And this one is also callable 2
I'm in the Initfunction
class 1
class 2
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Initfunction
class 1
class 2
I'm in the Initfunction
class 1
class 2
I'm in the Initfunction
class 1
class 2
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
我想要的类中的打印一次......只有文本“我在Testfunction中”我想要多次(10次)。
有没有人可能有解决方案?
答案 0 :(得分:1)
当我(很差)试图在评论中解释(现在已删除)时,你可以通过向init()
函数(以及类方法)添加一个带默认值的可选参数来实现:
from __future__ import print_function
import multiprocessing
import sys
sys_print = print # save built-in print function before replacement is defined
def print(*args, **kwargs):
"""Replacement for built-in that flushes output stream after each call."""
sys_print(*args, **kwargs)
stdout = kwargs.get('file', sys.stdout)
stdout.flush() # force any buffered output to be displayed
class class1():
# note addition of optional argument with default value
def classfunction1(self, a, notify=False):
self.x = a
if notify: print("class 1")
class class2():
# note addition of optional argument with default value
def classfunction2(self, a, notify=False):
self.y = a
if notify: print("class 2")
def test(i):
print("I'm in the Testfunction")
b = i * class1.x * class2.y
return b
def init(notify=False): # note addition of optional argument with default value
if notify: print("I'm in the Initfunction")
global class1, class2
class1 = class1()
class2 = class2()
x = 1
y = 2
class1.classfunction1(x, notify)
class2.classfunction2(y, notify)
if __name__ == "__main__":
init(True) # override default arg in this explicit call
print("This variable is callable", class1.x)
print("And this one is also callable", class2.y)
counter = list(range(10))
pool = multiprocessing.Pool(initializer=init, processes=4) # implicit calls
results = pool.imap(test, counter)
pool.close()
pool.join()
resultslist = list(results)
print(resultslist)
输出:
I'm in the Initfunction
class 1
class 2
This variable is callable 1
And this one is also callable 2
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
I'm in the Testfunction
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]