pacer-parallel 0.1.0-java → 0.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45fecca778590a9eedc6c7386894dd14847fb538
4
- data.tar.gz: 07d3840329d2aaa564b395313ce622395058c6ba
3
+ metadata.gz: 49501e461707e82d8442a765a9d85e5c3d6116fa
4
+ data.tar.gz: 14c307841f53a72eac941344f8aed4da07e333db
5
5
  SHA512:
6
- metadata.gz: f1f15ee12ce896353781f578924cd6912f1bfda5d776c740a8ed79582e8dd9dcedc820b215263fd487bc35fe4cbdd507901a5d74559264c14f88b8594e94333f
7
- data.tar.gz: 6dc2fab326c7ccfb7318e6be352b8309c0218f00fb13d0cfe5afc3203b9ba639a18aed6de70a8d93b877e8777d06537a268b456bfdbc0ca635288a61fed417fe
6
+ metadata.gz: 1e6f8de6c827d83f70752055cccdd6e46c2af7831320725fe2b01164bc4e941fef876ea501e8a356e6fe0b5ad211f1fa609c9c416143bc6f95be298a205df5c2
7
+ data.tar.gz: 1ec244e49d3b9a50518ae2df7634da3715c11ccf715be4802e9f81eafd68ca8483d4252500569796034c46be0c511b6c58539ccc56fff71cf83b30b0dd703cda
data/README.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  Parallelize [Pacer](https://github.com/pangloss/pacer) Routes.
4
4
 
5
+ ## Usage
6
+
7
+ The following will create a route that will do the operation in the block in 2 parallel threads, while consuming the source data and
8
+ enqueueing it for consumption by those threads in one additional thread:
9
+
10
+ ```ruby
11
+ g.v.parallel { |v| v.some_expensive_operation }
12
+ ```
13
+
14
+ There are a few simple options, all optional. By default in_buffer is equal to the number of threads, and output is not buffered.
15
+
16
+ ```ruby
17
+ g.v.parallel(threads: 8, in_buffer: 4, out_buffer: 10) do |v|
18
+ v.all(&:out)
19
+ end
20
+ ```
21
+
5
22
  ## Installation
6
23
 
7
24
  Add this line to your application's Gemfile:
@@ -16,20 +33,10 @@ Or install it yourself as:
16
33
 
17
34
  $ gem install pacer-parallel
18
35
 
19
- ## Usage
20
-
21
- ```ruby
22
- g.v.parallel(threads: 8, in_buffer: 4, out_buffer: 10) do |v|
23
- v.all(&:out)
24
- end
25
- ```
26
-
27
36
  ## Contributing
28
37
 
29
38
  1. Fork it
30
- 2. Create your feature branch (`git checkout -b my-new-feature`)
31
- 3. Commit your changes (`git commit -am 'Add some feature'`)
32
- 4. Push to the branch (`git push origin my-new-feature`)
39
+ ...
33
40
  5. Create new Pull Request
34
41
 
35
42
 
@@ -45,21 +52,22 @@ Or install it yourself as:
45
52
  it configurable.
46
53
  * standard copy split pipe can push the channel to subchannels
47
54
  * each parallel route pulls from the channel.
48
- * in a go block (waits will not block go thread pool)
49
- * ChannelReaderPipe
50
- * PathChannelReaderPipe
55
+ * in a go block (waits will not block go thread pool)
56
+ * ChannelReaderPipe
57
+ * PathChannelReaderPipe
51
58
  * parallel routes are unmodified
52
59
  * cap each route - eagerly consume input and push into a channel
53
- * ChannelCapPipe again
60
+ * ChannelCapPipe again
54
61
  * ExhaustMergePipe + GatherPipe to create a route to an list of
55
62
  channels
56
63
  * use alts to read from any of the channels
57
- * ChannelFanInPipe
64
+ * ChannelFanInPipe
58
65
 
59
66
 
60
67
 
61
68
  ## Pipe structure built to create parallel route:
62
69
 
70
+ ```
63
71
  CCP
64
72
  CSP (parallelism is 1 thread per pipe being split into)
65
73
  CRP -> Work ... -> CCP
@@ -67,4 +75,5 @@ it configurable.
67
75
  ...
68
76
  EMP
69
77
  GP
70
- CARP
78
+ CFIP
79
+ ```
data/project.clj CHANGED
@@ -1,5 +1,5 @@
1
1
  (defproject
2
- pacer.parallel "0.1.0-SNAPSHOT"
2
+ pacer.parallel "0.2.0-SNAPSHOT"
3
3
  :description "Leveraging core.async in Pacer"
4
4
  :url "http://xnlogic.com"
5
5
  :license {:name "MIT"}
@@ -14,6 +14,18 @@
14
14
  (close! c))
15
15
  c))
16
16
 
17
+ (defn pipe->path-chan [^Pipe pipe buffer]
18
+ (let [c (if buffer (chan buffer) (chan))]
19
+ (if (.hasNext pipe)
20
+ (future
21
+ (loop [v (.next pipe) path (.getCurrentPath pipe)]
22
+ (when v (>!! c path))
23
+ (if (.hasNext pipe)
24
+ (recur (.next pipe) (.getCurrentPath pipe))
25
+ (close! c))))
26
+ (close! c))
27
+ c))
28
+
17
29
  (defn chan-select [chans]
18
30
  (let [[v c] (alts!! chans)]
19
31
  (if v
@@ -8,10 +8,13 @@ import com.tinkerpop.pipes.util.FastNoSuchElementException;
8
8
  import clojure.lang.RT;
9
9
  import clojure.lang.Var;
10
10
  import clojure.lang.Symbol;
11
+ import java.util.List;
12
+ import java.util.ArrayList;
11
13
 
12
14
  public class ChannelCapPipe<S> extends AbstractPipe<S, Object> implements TransformPipe<S, Object> {
13
15
  private static final Var REQUIRE = RT.var("clojure.core", "require");
14
16
  private static final Var PIPE_TO_CHAN = RT.var("pacer.parallel", "pipe->chan");
17
+ private static final Var PIPE_TO_PATH_CHAN = RT.var("pacer.parallel", "pipe->path-chan");
15
18
  private static boolean environmentReady = false;
16
19
 
17
20
  public static void setupEnvironment() {
@@ -23,7 +26,6 @@ public class ChannelCapPipe<S> extends AbstractPipe<S, Object> implements Transf
23
26
  }
24
27
  }
25
28
 
26
-
27
29
  private Object buffer;
28
30
  private boolean hasRun = false;
29
31
 
@@ -35,12 +37,23 @@ public class ChannelCapPipe<S> extends AbstractPipe<S, Object> implements Transf
35
37
  protected Object processNextStart() {
36
38
  if (!this.hasRun) {
37
39
  this.hasRun = true;
38
- return PIPE_TO_CHAN.invoke(starts, buffer);
40
+ if (this.pathEnabled) {
41
+ return PIPE_TO_PATH_CHAN.invoke(starts, buffer);
42
+ } else {
43
+ return PIPE_TO_CHAN.invoke(starts, buffer);
44
+ }
39
45
  } else {
40
46
  throw FastNoSuchElementException.instance();
41
47
  }
42
48
  }
43
49
 
50
+ // If path is enabled, the path will be pushed into the channel.
51
+ // Having a path available here as well causes the merge pipe to
52
+ // produce a messed up path.
53
+ public List getCurrentPath() {
54
+ return new ArrayList();
55
+ }
56
+
44
57
  public void reset() {
45
58
  this.hasRun = false;
46
59
  }
@@ -15,6 +15,7 @@ public class ChannelFanInPipe<S> extends AbstractPipe<List<Object>, S> implement
15
15
  private static final Var CHAN_SELECT = RT.var("pacer.parallel", "chan-select");
16
16
 
17
17
  private Object chans;
18
+ private List currentPath;
18
19
 
19
20
  protected S processNextStart() {
20
21
  while (true) {
@@ -28,13 +29,28 @@ public class ChannelFanInPipe<S> extends AbstractPipe<List<Object>, S> implement
28
29
  this.chans = null;
29
30
  } else {
30
31
  this.chans = NTH.invoke(vec, 1);
31
- return (S) NTH.invoke(vec, 0);
32
+ if (this.pathEnabled) {
33
+ this.currentPath = (List) NTH.invoke(vec, 0);
34
+ System.out.println(this.currentPath);
35
+ return (S) this.currentPath.get(this.currentPath.size() - 1);
36
+ } else {
37
+ return (S) NTH.invoke(vec, 0);
38
+ }
32
39
  }
33
40
  }
34
41
  }
35
42
  }
36
43
 
44
+ public List getCurrentPath() {
45
+ if (this.pathEnabled) {
46
+ return this.currentPath;
47
+ } else {
48
+ throw new RuntimeException(Pipe.NO_PATH_MESSAGE);
49
+ }
50
+ }
51
+
37
52
  public void reset() {
53
+ this.currentPath = null;
38
54
  this.chans = null;
39
55
  }
40
56
  }
@@ -7,27 +7,52 @@ import com.tinkerpop.pipes.util.FastNoSuchElementException;
7
7
 
8
8
  import clojure.lang.RT;
9
9
  import clojure.lang.Var;
10
+ import java.util.List;
10
11
 
11
- public class ChannelReaderPipe<S> extends AbstractPipe<S, Object> implements TransformPipe<S, Object> {
12
+ public class ChannelReaderPipe<S> extends AbstractPipe<Object, S> implements TransformPipe<Object, S> {
12
13
  private static final Var READ_CHAN = RT.var("clojure.core.async", "<!!");
13
14
 
14
15
  private Object chan;
16
+ private List currentPath;
15
17
 
16
- protected Object processNextStart() {
18
+ protected S processNextStart() {
17
19
  while (true) {
18
20
  if (this.chan == null) {
19
21
  this.chan = starts.next();
20
22
  } else {
21
- Object value = READ_CHAN.invoke(this.chan);
23
+ Object value;
24
+ if (this.pathEnabled) {
25
+ this.currentPath = (List) READ_CHAN.invoke(this.chan);
26
+ if (this.currentPath != null) {
27
+ value = this.currentPath.get(this.currentPath.size() - 1);
28
+ } else {
29
+ value = null;
30
+ }
31
+ } else {
32
+ value = READ_CHAN.invoke(this.chan);
33
+ }
22
34
  if (value == null)
23
35
  this.chan = null;
24
36
  else
25
- return value;
37
+ return (S) value;
26
38
  }
27
39
  }
28
40
  }
29
41
 
42
+ public List getCurrentPath() {
43
+ if (this.pathEnabled) {
44
+ return this.currentPath;
45
+ } else {
46
+ throw new RuntimeException(Pipe.NO_PATH_MESSAGE);
47
+ }
48
+ }
49
+
50
+ protected List getPathToHere() {
51
+ return this.currentPath;
52
+ }
53
+
30
54
  public void reset() {
55
+ this.currentPath = null;
31
56
  this.chan = null;
32
57
  }
33
58
  }
@@ -1,6 +1,7 @@
1
1
  module Pacer
2
2
  module Parallel
3
- VERSION = "0.1.0"
3
+ # Be sure to update project.clj
4
+ VERSION = "0.2.0"
4
5
  JAR_VERSION = "#{VERSION}-SNAPSHOT"
5
6
  JAR = "pacer.parallel-#{ JAR_VERSION }-standalone.jar"
6
7
  JAR_PATH = "target/release/#{ JAR }"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pacer-parallel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: java
6
6
  authors:
7
7
  - Darrick Wiebe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-27 00:00:00.000000000 Z
11
+ date: 2013-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pacer
@@ -77,7 +77,7 @@ files:
77
77
  - src/ruby/pacer/parallel/channel_fan_in.rb
78
78
  - src/ruby/pacer/parallel/channel_reader.rb
79
79
  - src/ruby/pacer/parallel/version.rb
80
- - target/release/pacer.parallel-0.1.0-SNAPSHOT-standalone.jar
80
+ - target/release/pacer.parallel-0.2.0-SNAPSHOT-standalone.jar
81
81
  homepage: http://xnlogic.com
82
82
  licenses:
83
83
  - MIT