clj-python / clj-python/libpython-clj
How can I call python functions that rely on "event_loop" inside go blocks?
Nessuno ha ancora preso questa issue.
- Lingua principale
- Clojure
- Stelle
- 1.2k
- Fork
- 74
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
Huge thanks for the great library. I'm wondering if the following is possible.
The problem
I want to call python functions with asyncio.get_event_loop() inside go blocks.
The get_event_loop is buried deep in the python code base, so I can't simply swap every required event loop to some new event loop that I create.
I haven't come up with a way to write a wrapper, and setting the event loop manually does not help.
I'm not seeking to solve the exception, because I think my approach seems wrong and the exception is expected, but rather, I'm asking for a way for my goal.
Many Thanks!
A minimal example that crashes
(ns main.playasync
(:require [libpython-clj2.require :refer [require-python]]
[libpython-clj2.python :refer [py. py.. py.-] :as py]
[clojure.core.async :as async :refer [>! <! chan go]]))
(require-python '[agen]
'[builtins :as python]
'[asyncio])
(comment
(go
(let [ev-loop (asyncio/new_event_loop)]
(asyncio/set_event_loop ev-loop)
(asyncio/get_event_loop))))
will raise an exception
Exception in thread "async-dispatch-6" java.lang.Exception: Traceback (most recent call last):
File "/opt/homebrew/Caskroom/miniforge/base/lib/python3.9/asyncio/events.py", line 642, in get_event_loop
raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Dummy-6'.
at libpython_clj2.python.ffi$check_error_throw.invokeStatic(ffi.clj:703)
at libpython_clj2.python.ffi$check_error_throw.invoke(ffi.clj:701)
at libpython_clj2.python.ffi$simplify_or_track.invokeStatic(ffi.clj:960)
at libpython_clj2.python.ffi$simplify_or_track.invoke(ffi.clj:941)
at libpython_clj2.python.fn$call_py_fn.invokeStatic(fn.clj:197)
at libpython_clj2.python.fn$call_py_fn.invoke(fn.clj:177)
at libpython_clj2.python.bridge_as_jvm$generic_callable_pyobject$reify__17712.call(bridge_as_jvm.clj:427)
at libpython_clj2.python.fn$call_kw.invokeStatic(fn.clj:217)
at libpython_clj2.python.fn$call_kw.invoke(fn.clj:214)
at libpython_clj2.python.fn$cfn.invokeStatic(fn.clj:282)
at libpython_clj2.python.fn$cfn.doInvoke(fn.clj:273)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at libpython_clj2.python.bridge_as_jvm$generic_callable_pyobject$reify__17712.invoke(bridge_as_jvm.clj:427)
at main.playasync$eval31361$fn__31362$state_machine__28343__auto____31363$fn__31365.invoke(NO_SOURCE_FILE:14)
at main.playasync$eval31361$fn__31362$state_machine__28343__auto____31363.invoke(NO_SOURCE_FILE:11)
at clojure.core.async.impl.ioc_macros$run_state_machine.invokeStatic(ioc_macros.clj:978)
at clojure.core.async.impl.ioc_macros$run_state_machine.invoke(ioc_macros.clj:977)
at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invokeStatic(ioc_macros.clj:982)
at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invoke(ioc_macros.clj:980)
at main.playasync$eval31361$fn__31362.invoke(NO_SOURCE_FILE:11)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at clojure.core.async.impl.concurrent$counted_thread_factory$reify__22117$fn__22118.invoke(concurrent.clj:29)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.lang.Thread.run(Thread.java:833)
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con l’esempio minimo di core.async go nell’issue e con il traceback che mostra che asyncio.get_event_loop viene eseguito su un Dummy thread. Leggi il percorso delle chiamate Python di libpython-clj2 e il contesto di esecuzione di core.async go per determinare se è possibile supportare l’accesso al loop degli eventi. Il lavoro sarà completato quando esisterà un modo documentato e funzionante per chiamare queste funzioni Python dai blocchi go, oppure una spiegazione chiara del fatto che questo approccio non è supportato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- backend
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 25/100