我试图了解 IBM info-spare 流中的线程端口和@parallel 注释之间的区别,我搜索了很多地方但“无法得到我的答案,根据我的理解,它们都有助于使运算符线程化,但我不确定何时何地使用它们,它们可以一起使用以提高性能。有人可以用例子证实它们的用法吗?
谢谢。
我试图了解 IBM info-spare 流中的线程端口和@parallel 注释之间的区别,我搜索了很多地方但“无法得到我的答案,根据我的理解,它们都有助于使运算符线程化,但我不确定何时何地使用它们,它们可以一起使用以提高性能。有人可以用例子证实它们的用法吗?
谢谢。
线程端口主要是关于管道并行性。当您在运算符的子句上指定线程端口时config
,您是在告诉运行时使用与执行上游运算符的线程不同的线程来执行该运算符。我们称这种管道并行是因为管道中的操作符能够同时执行。如果管道中的算子在计算上足够昂贵,这可以提高吞吐量。
@parallel
注释主要是关于数据并行性。当您将@parallel(width=N)
注释应用于运算符调用时,Streams 将复制该运算符N
时间。您正在运行的应用程序将拥有N
该运算符的副本,每个副本接收元组总数的不同子集。我们称这种数据并行是因为我们通过复制操作符同时处理不同的数据(在 Streams 的情况下是元组)。当您有一个计算量很大的运算符,并且可以无序处理传入的元组时,@parallel
可以提高吞吐量。
在实践中,使用@parallel
注解有时会将线程端口注入您的应用程序,以确保复制的运算符执行并行发生。作为副作用,这也会引入一些管道并行性。
此应用程序演示了线程端口和@parallel
:streamsx.demo.logwatch。它是Optimizing Streams Applications演示文稿中开发的应用程序的源代码。