无结构的多处理打印命令

时间:2016-12-06 21:12:54

标签: python python-3.x class multiprocessing pool

今天我写了这篇文章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次)。

有没有人可能有解决方案?

1 个答案:

答案 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]