tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

multithreaded python: can't start new thread when building calibre



Hi!

When building calibre-2.x on NetBSD, I always had the problem that
building failed because:

####### Building extension magick #######
Compiling magick
Traceback (most recent call last):
  File "setup.py", line 99, in <module>
    sys.exit(main())
  File "setup.py", line 85, in main
    command.run_all(opts)
  File "/scratch/wip/calibre/work/calibre-2.15.0/setup/__init__.py", line 181, in run_all
    self.run_cmd(self, opts)
  File "/scratch/wip/calibre/work/calibre-2.15.0/setup/__init__.py", line 178, in run_cmd
    cmd.run(opts)
  File "/scratch/wip/calibre/work/calibre-2.15.0/setup/extensions.py", line 412, in run
    self.build(ext, dest)
  File "/scratch/wip/calibre/work/calibre-2.15.0/setup/extensions.py", line 456, in build
    if not parallel_build(jobs, self.info):
  File "/scratch/wip/calibre/work/calibre-2.15.0/setup/parallel_build.py", line 32, in parallel_build
    p = Pool(cpu_count)
  File "/usr/pkg/lib/python2.7/multiprocessing/dummy/__init__.py", line 151, in Pool
    return ThreadPool(processes, initializer, initargs)
  File "/usr/pkg/lib/python2.7/multiprocessing/pool.py", line 718, in __init__
    Pool.__init__(self, processes, initializer, initargs)
  File "/usr/pkg/lib/python2.7/multiprocessing/pool.py", line 159, in __init__
    self._repopulate_pool()
  File "/usr/pkg/lib/python2.7/multiprocessing/pool.py", line 223, in _repopulate_pool
    w.start()
  File "/usr/pkg/lib/python2.7/multiprocessing/dummy/__init__.py", line 75, in start
    threading.Thread.start(self)
  File "/usr/pkg/lib/python2.7/threading.py", line 745, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread
 *** Error code 1

The same chunk works fine in the interactive shell, not sure why it so
reliably breaks here.

http://debian.2.n7.nabble.com/Bug-760865-calibre-FTBFS-on-mips-thread-error-can-t-start-new-thread-td3353306.html

pointed me to the workaround of hardcoding the number of CPUs to one:

-    from multiprocessing import cpu_count
-    try:
-        cpu_count = cpu_count()
-    except NotImplementedError:
-        cpu_count = 1
+    cpu_count = 1

now calibre builds fine for me.

I wonder why it's necessary though. Does anyone have an idea? Is there
a problem in python + threading on NetBSD, or does it run into some
resource issues? But why so consistently in the (pbulk and manual)
build, but not when I execute the cpu_count() function in an
interactive shell?
 Thomas


Home | Main Index | Thread Index | Old Index