Thank you so much for the offer! I must admit that this does not look very encouraging :-(
On Thursday, 16 October 2025 at 18:10:26 UTC+2 [email protected] wrote: > As David said, threading usually leads to trouble with cypari at the > moment so you want to use forks instead (also SageMath doesn't claim to be > too thread-safe so if your machinery spawns multiple threads you'll see > crashes anyway.) > > With forks that are created by external libraries it can also be tricky to > get things right, see > https://github.com/flatsurf/flatsurvey/blob/master/flatsurvey/dask/task.py#L54 > > for some ideas what was needed to get SageMath to work with dask spawning > processes. > > Feel free to reach out directly if you need some help here. > > julian > > On Thursday, October 16, 2025 at 6:45:46 PM UTC+3 David Roe wrote: > >> See https://github.com/sagemath/cypari2/issues/107 and the other issues >> linked there. This has been an issue for the LMFDB for 4 years (it >> prevents auto-restarting the webserver when files are changed, which is a >> convenient feature when developing, and also prevents us from offering >> large file downloads because of single-thread timeouts); we tried fixing it >> but did not succeed. There is an attempt started at >> https://github.com/sagemath/cypari2/pull/116, but it's not working yet. >> >> Using gunicorn (multiple processes rather than multiple threads) should >> work. The problem arises in the LMFDB's context when using the Werkzeug >> server <https://werkzeug.palletsprojects.com/en/stable/> that comes with >> Flask by default; things seem to work fine on our production servers that >> use gunicorn. But, as you say, that means you don't get shared memory. >> >> The actual solution probably requires changing how cypari2 interacts with >> Pari's memory management. There have been a few attempts, but nothing that >> seems to have fixed this threading issue. I don't have time to dive into >> this (again), but I'm happy to test fixes if someone else wants to tackle >> it. >> David >> >> On Thu, Oct 16, 2025 at 11:22 AM 'Martin R' via sage-devel < >> [email protected]> wrote: >> >>> I ran into a rather strange problem concerning pari and threading. >>> After my signature is a small working and a small non-working example >>> giving context, and here is a minimal non-working example: >>> >>> sage: import threading >>> sage: t = threading.Thread(target=pari.version) >>> sage: t.start() >>> Exception in thread Thread-1 (version): >>> Traceback (most recent call last): >>> File "/usr/lib/python3.12/threading.py", line 1073, in _bootstrap_inner >>> sage: self.run() >>> File "/usr/lib/python3.12/threading.py", line 1010, in run >>> self._target(*self._args, **self._kwargs) >>> File "cypari2/pari_instance.pyx", line 759, in >>> cypari2.pari_instance.Pari.version >>> File "cypari2/auto_instance.pxi", line 39540, in >>> cypari2.pari_instance.Pari_auto.version >>> cysignals.signals.SignalError: Segmentation fault >>> >>> I found https://github.com/sagemath/sage/issues/28800, which seems to >>> say that this is an issue, with the caveat that I don't know anything about >>> threading. I did not write the code responsible for threading in the >>> application I'm working on (FindStat), but it seems that threading is >>> somewhat unavoidable, since it uses waitress to serve. So, I have two >>> questions: >>> >>> 1) is the issue linked above indeed the reason for the segfault I am >>> observing? >>> 2) is there a workaround? >>> >>> Concerning 2, in case it helps: all code in FindStat accessing any >>> "mathematical" functionality is isolated (in fact, because it is >>> user-contributed). Unfortunately, I don't really understand how the >>> threads in FindStat are started. >>> >>> Also concerning 2, ChatGPT suggested to replace waitress using >>> gunicorn. However, this comes with its own problems, because there is a >>> lot of dynamic data which must be shared, and access to which must be fast. >>> >>> Many thanks and best wishes, >>> >>> Martin >>> >>> >>> # Example for context >>> sage: import threading >>> sage: fun = lambda: print(BinaryTrees(3).cardinality()) >>> sage: t = threading.Thread(target=fun) >>> sage: t.start() >>> 5 >>> sage: fun = lambda: print(RootedTrees(3).cardinality()) >>> sage: t = threading.Thread(target=fun) >>> sage: t.start() >>> sage: Exception in thread Thread-3 (<lambda>): >>> Traceback (most recent call last): >>> File "sage/misc/cachefunc.pyx", line 1019, in >>> sage.misc.cachefunc.CachedFunction.__call__ >>> KeyError: ((3,), ()) >>> >>> During handling of the above exception, another exception occurred: >>> >>> Traceback (most recent call last): >>> File "/usr/lib/python3.12/threading.py", line 1073, in _bootstrap_inner >>> self.run() >>> File "/usr/lib/python3.12/threading.py", line 1010, in run >>> self._target(*self._args, **self._kwargs) >>> File "<ipython-input-16-3e6183557abd>", line 1, in <lambda> >>> File "/home/martin/sage/src/sage/combinat/rooted_tree.py", line 737, >>> in cardinality >>> return number_of_rooted_trees(self._n) >>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>> File "sage/misc/cachefunc.pyx", line 1024, in >>> sage.misc.cachefunc.CachedFunction.__call__ >>> File "/home/martin/sage/src/sage/combinat/rooted_tree.py", line 53, in >>> number_of_rooted_trees >>> return sum(sum(d * number_of_rooted_trees(d) for d in k.divisors()) * >>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >>> File "/home/martin/sage/src/sage/combinat/rooted_tree.py", line 53, in >>> <genexpr> >>> return sum(sum(d * number_of_rooted_trees(d) for d in k.divisors()) * >>> ^^^^^^^^^^^^ >>> File "sage/rings/integer.pyx", line 3184, in >>> sage.rings.integer.Integer.divisors >>> return pari_divisors_small(self) >>> File "sage/libs/pari/convert_sage.pyx", line 431, in >>> sage.libs.pari.convert_sage.pari_divisors_small >>> File "sage/libs/pari/convert_sage.pyx", line 468, in >>> sage.libs.pari.convert_sage.pari_divisors_small >>> cysignals.signals.SignalError: Segmentation fault >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "sage-devel" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To view this discussion visit >>> https://groups.google.com/d/msgid/sage-devel/817b1a12-4258-43f3-a1ce-a8ebd1937983n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/sage-devel/817b1a12-4258-43f3-a1ce-a8ebd1937983n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/sage-devel/60a2180b-0b7b-4d79-bd95-97909368d63dn%40googlegroups.com.
