4

我已經安裝了Python 3的嵌入式系統(ARMv5tejl AT91SAM9X25,運行基於buildroot的rootfs的128MB RAM)。我已經讓系統運行了很多天,並且我已經開始對它進行一些python開發工作,但似乎遇到了創建新線程的問題。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 

使用this method,線程我的系統上的總數爲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,並且他們的線程實現上有任何文檔?

+0

線程無疑是啓用的,因爲我在使用線程的單元上編寫了Python軟件。這就是現在,運行該軟件失敗,因爲解釋器無法創建線程。 –

+0

我想知道OP是否解決過這個問題? – holdenweb