多处理线程池连接参数



我有一个很长的列表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)

接收器是一个简单的测试函数,如下所示:

def receiver(group):
print(group)

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

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

a
b
c
de
e
f
gh
i

我正在努力理解为什么会这样。调用接收器时出现问题,可能是由于接收器带来的非阻塞?

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

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

你遇到了经典的并发问题:你认为原子的一切都不是。 实际上打印函数打印两件事:你传递给它的数据和end参数,默认情况下是"n"

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

在雷蒙德·赫廷格(Raymond Hettinger(的演讲中,这一切都得到了更好的解释。

PS:我希望你知道python GIL。简而言之:只有一个python指令可以同时在所有python线程上执行。如果你想加快函数的执行 - 使用多处理,当你的线程大部分时间阻塞时,多线程很有用(例如,网络主要是等待数据包到达,所以线程是可以的(

相关内容

  • 没有找到相关文章