我正在修改facebook / pfff工具,特别是this file。
我在graph_code_java.ml中附加详细信息(节点和边缘),以及在两个单独的文件中遇到节点和顶点的时间:Edges.json和GraphSON.json。
最后,在执行完所有内容后,我调用了函数cleanup_graphson,它将Edges.json和GraphSON.json合并。
以下是我修改后graph_code_java的样子:
let build ?(verbose=true) ?(only_defs=false) root files =
let g = G.create () in
G.create_initial_hierarchy g;
let lookup_fails = Common2.hash_with_default (fun () -> 0) in
(* step1: creating the nodes and 'Has' edges, the defs *)
...
(* step3: creating the 'Use' edges that can rely on recursive inheritance *)
if verbose then pr2 "\nstep3: extract uses";
files +> Console.progress ~show:verbose (fun k ->
List.iter (fun file ->
k();
let readable = Common.readable ~root file in
let ast = parse ~show_parse_error:false file in
extract_defs_uses ~phase:Uses ~g ~ast ~readable ~lookup_fails;
));
end;
(* step 4: Merge Edges.json and GraphSON.json *)
if !write_to_graphson = true then
begin
pr "cleaning up";
GS.cleanup_graphson;
end;
g
cleanup_graphson函数如下所示:
let cleanup_graphson =
pr "Cleaning up!";
Common.append_file "GraphSON.json" "] \n";
Common.append_file "Edges.json" "] \n";
let str = Common.read_file "Edges.json" in
Common.append_file "GraphSON.json" str
但是当我运行程序时,cleanup_graphson在其他所有内容之前被称为(步骤1,步骤2,步骤3)。除此之外,所有其他步骤都按顺序运行。我不确定为什么会这样,是因为正在执行文件操作?还有其他人遇到过这个问题吗?
P.S:Console.progress的代码是here。
感谢您查看我的问题!
答案 0 :(得分:3)
cleanup_graphson是一个变量,而不是一个函数。当我将其修改为下面时,它按顺序执行。我在cleanup_graphson中添加了一个()作为参数。
let cleanup_graphson ()=
pr "Cleaning up!";
Common.append_file "GraphSON.json" "] \n";
Common.append_file "Edges.json" "] \n";
let str = Common.read_file "Edges.json" in
Common.append_file "GraphSON.json" str
答案 1 :(得分:2)
除非您专门使用多线程,否则任何代码都不会异步执行。
在不知道任何有关此代码的情况下,我怀疑存在缓冲问题。也许计算按照您期望的顺序进行,但pr
的输出在其他输出之前出现。当程序使用两种截然不同的写输出方式时,这很容易发生。