C++ 杂谈(18)

初试 concept

装好了 GCC6,下面试试 concept

#include <type_traits>

template<typename T>
requires std::is_arithmetic<T>::value
struct foo {};
 
int main(int, char**) {
  foo<int> a;
  return 0;
}

如下编译

$ make foo CXX=g++-mp-6 CXXFLAGS=-std=c++1z
g++-mp-6 -std=c++1z    foo.cpp   -o foo

有意思的是如果传递 std::string 则会挂掉

foo.cpp: In function 'int main(int, char**)':
foo.cpp:9:18: error: template constraint failure
 foo<std::string> a;
 ^
foo.cpp:9:18: note: constraints not satisfied
foo.cpp:9:18: note: 'std::is_arithmetic<_Tp>::value' evaluated to false

哎真好用!赶紧看看提供了哪些可以直接用的 concept 吧!

一个挺重要的 controller/worker 的 pattern

很多分布式程序都需要用一个 controller 管理一些 worker,但是比较方便的是让 controller 和 worker share 同一个 binary,比如实现一个 DSL 的分布式计算,很明显,通过 DSL 我们可以很容易的将操作的 dependency 记录下来,同时要求

  • 一个 stateless 的操作,我们可以直接记录该操作的指针(free function)或者类型(functor);
  • 一个 stateful 的操作,我们可以记录 state 本身(serialization/deserialization)以及类型,这样在 worker 上根据这两者将其实例化

这样一来 share 同一个 binary 可以保证很多情况直接使用函数的地址就行。那么问题在于怎么能让 controller 和 worker 共享同一个 binary 呢?

dsl::begin();
auto a = dsl::load("/path/to/files");
auto b = a.filter_by(&func1)
    .map_by(&func2);
dsl::save(b);
dsl::end();

很显然这种方式设计的 API 需要有一个转折点:dsl::begin() 和 dsl::end(),它们的实现可能有多种,我们先讨论一个最简单的手法:在 begin 里面根据某个 command-line flag 来控制程序的行为:

  • 如果这个 flag 没有设定,我们认为是 controller,于是继续执行后面的 code 直到 dsl::end(),其间的代码使用的 DSL 获得的关系被存储下来,在 dsl::end() 时我们对这些内容进行分析,获得 execution plan,并将这个 execution 逐步的分发到启动的 worker 上进行计算(当然这里我们需要通过一个 cluster 的 resource manager 获得对应的 worker,并将同样的 binary 部署在他们上面)
  • 与 controller 唯一不同的是该 flag 被设定,程序执行到 dsl::begin() 以后进入另一个分支,这部分我们预先已经实现,其实就是进入一个待命状态,等候 controller 分配任务,比如使用 IO 获得 a 的部分内容,使用 func1 进行 filter、使用 func2 将某个类型的数据计算成为另一个类型

这个方法很容易实现,但是有一个小缺点,我们必须得在程序很早的地方通过 dsl::begin() 进入这个区域,同时在每个在 worker 里执行的部分来说,他们不可以通过同样的语法启动更多的 worker(不能 nest),比如 func2 里面不能调用 dsl::begin() 进入新的一个处理。这种问题常见于 MapReduce 的 reducer 实现上,通常不能在 reducer 里面简单的通过 map 处理,而必须面对一个类似于流的一个类型来处理。一个程序里面可以有多个 begin()/end() pair,但是之间的代码永远只在 controller 上执行。

————————
And the captain of the guard charged Joseph with them, and he served them:and they continued a season in ward

Advertisements
C++ 杂谈(18)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s