LINUX.ORG.RU
ФорумAdmin

питону не хватает памяти


0

1

при запуске больше 150 потоков на сервере валятся ошибки:

    future = self.executor.submit(self._worker, [i, job, attr])
  File "/usr/local/lib/python3.2/concurrent/futures/thread.py", line 103, in submit
    self._adjust_thread_count()
  File "/usr/local/lib/python3.2/concurrent/futures/thread.py", line 119, in _adjust_thread_count
    t.start()
  File "/usr/local/lib/python3.2/threading.py", line 683, in start
    _start_new_thread(self._bootstrap, ())
_thread.error: can't start new thread


  File "/var/www/sqlite.py", line 207, in upd
    self.cursor.execute(sql)
MemoryError

объем памяти на сервере 2гб при этом на ноуте с 1.5гб запускаются все 350 потоков.

где-то стоит лимит на память для питона?

# cat /proc/sys/kernel/threads-max 278496

ulimit -u 1024

при запуске больше 150 потоков

Сделай вдоль уже, а? Оставь бедный питон и несчастный сервер в покое. Блжад, почему ты не можешь понять одну простую вещь — тебе не нужны стопитсот потоков, вообще, никогда (разве что на стопитсотядерном процессоре).

baverman ★★★
()
Ответ на: комментарий от x0r

и по потоку на сокет

Он уже год как носится с этим диким количеством потоков. Можно было бы и книжку какую-нибудь прочесть. Не в коня корм — это про ТС.

baverman ★★★
()
Ответ на: комментарий от baverman

Вопрос для повышения самообразованности: как ты предлагаешь писать, например, серверное приложение, работающее с неким сессионным протоколом и возможноcтью одновременной работы с ~1000 клиентов? Язык не важен.

x0r ★★★★★
()
Ответ на: комментарий от baverman

Так ведь хендлинг ивентов будет сихронный, не? А если в рамках хендлера надо, например, рулить sip транзакцию? Кастану beastie

x0r ★★★★★
()
Ответ на: комментарий от x0r

> А если в рамках хендлера надо, например, рулить sip транзакцию?

Ну и рули. Всё I/O заруливай в евентлуп. Одного потока хватит на всех.

const86 ★★★★★
()
Ответ на: комментарий от x0r

Так ведь хендлинг ивентов будет сихронный

Никто не мешает в обработчике прерваться.

baverman ★★★
()
Ответ на: комментарий от tailgunner

>>Попробуй поиграть с threading.stack_size

выдает 0, значит юзает системный

системные лимиты:

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 139248
max locked memory (kbytes, -l) 32
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) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited


Блжад, почему ты не можешь понять одну простую вещь — тебе не нужны стопитсот потоков


вот честно, как задрали вы с такими советами! почему нельзя просто помочь в решении одного конкретного вопроса, а не учить жить?
да может я научное исследование потоков провожу, нахрена тогда мне ваши советы сделать всё через какую-то асинхронную жопу в один поток.

Мне надо 350 потоков и питон это должен делать, всё!
Не надо всей этой пустой демагогии об архитектуре моего софта, о котором вы знаете только то что он на питоне.

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

>>Попробуй поиграть с threading.stack_size

выдает 0, значит юзает системный

Ну так сделай меньше.

Мне надо 350 потоков и питон это должен делать, всё!

Если тебе надо 350 нитей, ты должен уметь конфигурировать серверы так, чтобы они тебе это позволяли, всё!

tailgunner ★★★★★
()
Ответ на: комментарий от sergey-novikov

да может я научное исследование потоков провожу

Больше похоже на то как дурак богу молится.

baverman ★★★
()
Ответ на: комментарий от tailgunner

>>Если тебе надо 350 нитей, ты должен уметь конфигурировать серверы так, чтобы они тебе это позволяли, всё!

за этим я и создал эту тему
зачем делать stack size меньше системного? как-то нелогично

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

> зачем делать stack size меньше системного?

Мде. Ты, похоже, еще даже не попробовал?

как-то нелогично

facepalm.bmp Тебе правда нужен стек в 10М?

tailgunner ★★★★★
()
Ответ на: комментарий от x0r

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

На обработку задачи дается определенный таймаут. Если зависла - регистрируется ошибка и как-то обрабатывается. Так как поток обработки не один, весь сервер в это время не висит.

Если забились все потоки, то тут я пока ничего не придумал. Можно динамически добавлять потоки в пул до некоторого лимита и уменьшать таймауты.

note173 ★★★★★
()
Ответ на: комментарий от note173

>>На обработку задачи дается определенный таймаут. Если зависла - регистрируется ошибка и как-то обрабатывается.

а если задача - выполнять хттп-запросы к разным серверам, да ещё и через прокси, да ещё и не все прокси валидны и надо их чекать - какой таймаут на задачу поставишь?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

Секунд 30. В крайнем случае такой подход можно свести к 1 соединение - 1 поток, но пр нормальных условиях это происходить не должно.

note173 ★★★★★
()
Ответ на: комментарий от Harald

и если он эту минуту будет только прокси чекать, ища рабочую - значит обрываем задачу и помечаем как невыполненную?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

а если задача - выполнять хттп-запросы к разным серверам, да ещё и через прокси, да ещё и не все прокси валидны и надо их чекать

Тогда сам бог велел делать это асинхронно, мой дорогой спамер.

baverman ★★★
()
Ответ на: комментарий от Harald

>> нет, помечаем прокси как дохлый
так задача не в этом, это лишь часть задачи
причем неизвестно сколько будет таких прокси, прежде чем попадется валид

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от baverman

>>Тогда сам бог велел делать это асинхронно, мой дорогой спамер.
ой вы меня раскусили, вы такой проницательный, пора регать новый акк

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

проблема решена уменьшением стека

import threading
threading.stack_size(64*1024)

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.