Skip to content

Commit

Permalink
WIP: Decouple threads and contexts in PythonPool, so a single context…
Browse files Browse the repository at this point in the history
… may still handle multiple requests in parallel
  • Loading branch information
timfel committed Jan 28, 2025
1 parent ef15ee4 commit 78402d1
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 11 deletions.
4 changes: 2 additions & 2 deletions graalpy/graalpy-micronaut-multithreaded/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
<!--TODO: Selecting a Python version different from the Micronaut BOM -->
<dependency>
<groupId>org.graalvm.python</groupId>
<artifactId>python-community</artifactId>
<artifactId>python</artifactId>
<version>${python.version}</version>
<type>pom</type>
</dependency>
Expand Down Expand Up @@ -118,7 +118,7 @@
<version>${python.version}</version>
<configuration>
<packages>
<package>pandas==2.2.0</package>
<package>pandas==2.2.2</package>
</packages>
</configuration>
<executions>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Engine;
import org.graalvm.polyglot.Value;
import org.graalvm.python.embedding.utils.GraalPyResources;
import org.graalvm.python.embedding.utils.VirtualFileSystem;
import org.graalvm.python.embedding.GraalPyResources;
import org.graalvm.python.embedding.VirtualFileSystem;

@io.micronaut.context.annotation.Context
public class PythonPool extends AbstractExecutorService {
private final Engine engine;
private final ThreadLocal<Context> thisContext;
private final BlockingQueue<Context> contexts;
private final BlockingDeque<Context> contexts;
private final ExecutorService threadPool;
private final int size;

Expand Down Expand Up @@ -70,15 +70,24 @@ public int getPoolSize() {
private PythonPool(int nContexts) {
size = nContexts;
engine = Engine.create();
contexts = new LinkedBlockingQueue<>();
contexts = new LinkedBlockingDeque<>();
thisContext = new ThreadLocal<>();
threadPool = Executors.newFixedThreadPool(nContexts, new ThreadFactory() {
for (int i = 0; i < nContexts; i++) {
contexts.addLast(createContext(engine));
}
threadPool = Executors.newCachedThreadPool(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
// associate contexts with threads round-robin
return new Thread(() -> {
var c = createContext(engine);
contexts.add(c);
Context c;
try {
c = contexts.takeFirst();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
thisContext.set(c);
contexts.addLast(c);
r.run();
});
}
Expand Down

0 comments on commit 78402d1

Please sign in to comment.