多处理线程池连接参数

时间:2018-06-26 08:46:30

标签: python-3.x multiprocessing threadpool

我有一个很长的列表data,假设它看起来像这样:

[(a, a, 1),
(b, b, 1),
(c, c, 1),
(d, d, 1),
(e, e, 1),
(f, f, 1),
(g, g, 1),
(h, h, 1),
(i, i, 1),]

我正在尝试如下使用多线程:

from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
pool.starmap(help_func, data)

Help_func如下:

def help_func(in_vala, in_valb, in_valc):
    print("asking for " + str(in_vala) + " asking for " + str(in_valb))
    receiver(in_vala)

and接收器是一个简单的测试功能,

def receiver(group):
    print(group)

运行程序时,我可以看到help_func的输出是正确的,即它枚举了data的值。

但是,当我查看在receive()处生成的值时,我注意到一些奇怪的打印,如下所示:

a
b
c
de
e
f
gh
i

我正在努力弄清为什么会这样。呼叫接收方时出现问题,可能是由于接收方带来的非阻塞性可能?

我应该如何解决这个问题。

此外,当我使用ThreadPool(1)时,没有看到此问题。我的实际问题有一个更大的函数,该函数从help_func调用,因此我希望在多个线程下理想地运行它。

1 个答案:

答案 0 :(得分:0)

您正在遇到经典的并发问题:您认为不是原子的所有事情都不是。实际上,print函数会打印两件事:传递给它的数据和end参数,默认情况下为"\n"

因此串联是一个线程写入数据,然后是其他线程写入数据,然后都写入新行的结果。

this Raymond Hettinger talk中有更好的解释。

P.S .:希望您了解python GIL。简而言之:只有一条python指令可以同时在所有python线程上执行。如果您想加快函数的执行速度-使用多处理,则在线程大部分时间处于阻塞状态时,多线程很有用(例如,网络通常在等待数据包到达,因此线程可以这样做)