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.

Reply via email to