我一直在玩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
已有一段时间了,最近我尝试使用Flow
和Flow
使用以下内容来并行化我的工作流程:
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
答案 0 :(得分:2)
在我们的项目中有两种实现方法。
更简单的方法:使用资源ID作为数据源。
您可以先列出所有资源ID,然后再分别获取每个资源。
常规方法:使用Stream.resource/3
自定义数据源。
您还可以通过Stream.resource/3
创建流,使用分页查询一次获取一些资源。
在此处查看更多详细信息,How to build Streams in Elixir easily with Stream.resource/3 Awesomeness