Python не может запустить новый поток, но не достигает предела потока

#linux #multithreading #python-3.x #embedded-linux #python-multithreading

#linux #многопоточность #python-3.x #встроенный-linux #python-многопоточность

Вопрос:

У меня есть встроенная система (armv5tejl AT91SAM9X25 с 128 МБ оперативной памяти под управлением rootfs на основе buildroot) с установленным Python 3. Я оставил систему запущенной уже много дней, и я пришел, чтобы поработать над ней на python, но, похоже, столкнулся с проблемой создания новых потоков.

Если я попытаюсь запустить следующую программу:

 Type "help", "copyright", "credits" or "license" for more information.
>>> import threading
>>> import time
>>> def func():
...     i = 0
...     while True:
...         i  = 1
...         print(i)
...         time.sleep(1)
...
>>>
>>> func()
1
2
3
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in func
KeyboardInterrupt
>>> t = threading.Thread(target=func)
>>> t.start()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/threading.py", line 850, in start
RuntimeError: can't start new thread
>>>
  

Как вы можете видеть, при попытке запустить поток я получаю указанную выше ошибку. Некоторые первоначальные поисковые запросы в Интернете, похоже, указывают на то, что проблема может быть связана с тем, что система работает с ограничениями потока. Вот результат ulimit -a:

 # ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 961
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 961
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  

Используя этот метод, общее количество потоков в моей системе составляет 75, что намного ниже предела в 961. Вот мое текущее состояние памяти:

 # free -m
             total       used       free     shared    buffers     cached
Mem:           120        118          2         60          0         65
-/  buffers/cache:         52         67
Swap:            0          0          0
  

Я также запустил уплотнитель памяти, запустив echo 1 > /proc/sys/vm/compact_memory .

Я полагаю, что все будет работать нормально, если я перезагружу устройство (поскольку код известен как рабочий код), но поскольку сейчас у меня есть устройство в этом состоянии, я очень хочу попытаться понять, в чем проблема.

Ответ №1:

Возможно, просто потоковая передача не включена в вашей реализации Python. Это одна из наиболее проблемных областей для разработчиков. Кто предоставил Python и есть ли у них вообще какая-либо документация по их реализации потоков?

Комментарии:

1. Потоковая обработка определенно включена, поскольку я написал программное обеспечение Python на устройстве, использующем потоки. Просто сейчас запуск этого программного обеспечения завершается сбоем, потому что интерпретатор не может создать поток.

2. Я столкнулся с той же проблемой в среде, где потоковая обработка некоторое время отлично работает. И время от времени это происходит. Было бы здорово узнать, есть ли причина, помимо попадания в 256 потоков