Repo.stream作为Flow的无限数据源

时间:2018-03-08 08:16:20

标签: elixir genstage

我一直在玩Elixir CC = g++ -DSGI #CC = CC -DSGI -no_auto_include CFLAGS = -O3 HEADER = Array.h Itemset.h Lists.h Eqclass.h extl2.h OBJS = Itemset.o Array.o Eqclass.o Lists.o extl2.o partition.o LIBS = -lm -lc TARGET = seq calcl2 default: $(TARGET) clean: rm -rf *~ *.o $(TARGET) seq: sequence.cc $(OBJS) $(HEADER) $(CC) $(CFLAGS) -o seq sequence.cc $(OBJS) $(LIBS) Database.o: Database.cc Database.h $(CC) $(CFLAGS) -c -o Database.o Database.cc Lists.o: Lists.cc Lists.h $(CC) $(CFLAGS) -c -o Lists.o Lists.cc Itemset.o: Itemset.cc Itemset.h $(CC) $(CFLAGS) -c -o Itemset.o Itemset.cc Array.o: Array.cc Array.h $(CC) $(CFLAGS) -c -o Array.o Array.cc Eqclass.o: Eqclass.cc Eqclass.h $(CC) $(CFLAGS) -c -o Eqclass.o Eqclass.cc HashTable.o: HashTable.cc HashTable.h $(CC) $(CFLAGS) -c -o HashTable.o HashTable.cc ext.o: ext.cc ext.h $(CC) $(CFLAGS) -c -o ext.o ext.cc extl2.o: extl2.cc extl2.h $(CC) $(CFLAGS) -c -o extl2.o extl2.cc partition.o: partition.cc partition.h $(CC) $(CFLAGS) -c -o partition.o partition.cc calcl2: partition.o calcdb.o calcl2.cc partition.h calcl2.h $(CC) $(CFLAGS) -o calcl2 partition.o calcdb.o calcl2.cc $(LIBS) calcdb.o: calcdb.cc calcdb.h $(CC) $(CFLAGS) -c -o calcdb.o calcdb.cc 已有一段时间了,最​​近我尝试使用FlowFlow使用以下内容来并行化我的工作流程:

Repo.stream

但它不起作用。现在我做了一些研究并偶然发现了来自Jose Valim的这个comment说基本上endless_db_stream = MyRepo.stream(some_query) MyRepo.transaction(fn -> endless_db_stream |> Flow.from_enumerable() |> Flow.each(&process(&1)) |> Flow.run end) Repo.stream并不真正兼容,我认为它也与GenStage不兼容(因为它建立在Flow)之上。

我的问题是,是否有人使用PSQL作为GenStage的无限数据源?

P / S:在上面的同一个GitHub线程中,有一个“hack”使用Flow来包装GenStage然后充当制作人,但我一直在寻找一种更简化的方法因为我打算使用Repo.stream代替Flow

1 个答案:

答案 0 :(得分:2)

在我们的项目中有两种实现方法。

  1. 更简单的方法:使用资源ID作为数据源。

    您可以先列出所有资源ID,然后再分别获取每个资源。

  2. 常规方法:使用Stream.resource/3自定义数据源。

    您还可以通过Stream.resource/3创建流,使用分页查询一次获取一些资源。

在此处查看更多详细信息,How to build Streams in Elixir easily with Stream.resource/3 Awesomeness