Amr*_*hit 5 linux multithreading embedded-linux python-multithreading python-3.x
我有一个安装了 Python 3 的嵌入式系统(armv5tejl AT91SAM9X25,具有 128MB RAM,运行基于 buildroot 的 rootfs)。我已经让系统运行很多天了,我开始对其进行一些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
>>>
Run Code Online (Sandbox Code Playgroud)
如您所见,当尝试启动线程时,我收到上述错误。一些初步的在线搜索似乎表明问题可能是由于系统遇到线程限制造成的。这是 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
Run Code Online (Sandbox Code Playgroud)
使用此方法,我的系统上的线程总数为 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
Run Code Online (Sandbox Code Playgroud)
我还通过运行来运行内存压缩器echo 1 > /proc/sys/vm/compact_memory。
我想如果我重新启动设备,一切都会正常工作(因为代码是已知的工作代码),但由于我现在的设备处于这种状态,我热衷于尝试了解问题所在。