LINUX.ORG.RU

[Python] Прожорливый multiprocessing.


0

2

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

Дажe такой пример

#!/usr/bin/python
# coding: utf-8
import gtk
import gobject
import multiprocessing as mpro
import Queue

RUNMULTIPRIOCESS = False


def get_page(que):
	que.put("aaaaaa")


class DrawGraph(gtk.DrawingArea):
	def __init__(self):
		super(DrawGraph, self).__init__()
		self.connect("expose_event", self.expose)
		self.update()
		gobject.timeout_add(120, self.update)

	def expose(self, widget, event):
		cr = widget.window.cairo_create()
		if RUNMULTIPRIOCESS:
			que = mpro.Queue()
			p = mpro.Process(target=get_page, args=(que,))
			p.start()
			p.join(0.1)
			if p.is_alive():
				p.terminate()
				print "terminate"
		else:
			que = Queue.Queue()
			get_page(que)

		while not que.empty():
			print  que.get()
		return False

	def update(self):
		if self.window:
			alloc = self.get_allocation()
			rect = gtk.gdk.Rectangle(alloc.x, alloc.y, alloc.width, alloc.height)
			self.window.invalidate_rect(rect, True)
			self.window.process_updates(True)
		return True


def main():    
	window = gtk.Window()
	window.resize(555, 220)
	window.add(DrawGraph())
	window.connect("destroy", gtk.main_quit)
	window.show_all()


if __name__ == "__main__":
	main()
	gtk.main()
тратит в четыре раза больше cpu в режиме multiprocess (хотя ничего полезного и не делает и процессы в нём не зависают).

В чём может быть дело?

И , заодно, возможно ли в нём(multiprocess) установить лимит на число процессов?Что-то не нашел.

★★

> тратит в четыре раза больше cpu в режиме multiprocess (хотя ничего полезного и не делает

Ты что, чистый оверхед меряешь?

tailgunner ★★★★★ ()

Твой код странен. Запускаешь процесс каждый раз и хочешь производительности?

baverman ★★★ ()

И , заодно, возможно ли в нём(multiprocess) установить лимит на число процессов?Что-то не нашел.

Pool

baverman ★★★ ()

читал я как-то PEP8, там значит 4хпробельные отступы стронгли рекомендид

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

Глупый анонимус путает отступы с выравниванием?

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

За выравнивание табами дают по рукам в первую очередь.

tensai_cirno ★★★★★ ()

Ты что, чистый оверхед меряешь?

Я по ps смотрел.~1% в обычном виде и 4 в multiprocessing

Твой код странен. Запускаешь процесс каждый раз и хочешь производительности?

Чем странен?Производительности - хочу, для чего же этот модуль, для галочки чтоли?При обычном-то запуске (ведь тоже «каждый раз») не проседает.Понятно, дополнительный процесс - но не в несколько же раз на такой тупейшей задаче.

Pool видел, как-то это избыточно в данном случае.Я думал может без лишних сущностей можно указать, типа как для Queue

Queue(maxsize=x)
Ну это не особо важно.

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

>> Ты что, чистый оверхед меряешь?

Я по ps смотрел.~1% в обычном виде и 4 в multiprocessing

Ы? Я спрашивал - выполняет ли твоя программа хоть что-нибудь полезное, или это просто бенчмарк на скорость порождения процессов. Насколько я понимаю код, ничего полезного не выполняется, но тогда непонятно, почему ты делаешь из этого какие-то выводы.

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

threading? Там своих граблей полно.Основное - я так и ниасилил как в данном случае(в реальном приложении всё не так просто) убивать зависшие треды.В итоге они плодятся, уходят куда-то далеко в фон и внезапно(!) вылезают когда уже не нужны.)

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

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

>Я спрашивал - выполняет ли твоя программа хоть что-нибудь полезное,

Выполняет, просто я выбрал для примера части которые на мой взгляд могут быть причиной прожорливости multiprocessing-a (gobject, cairo)

Программа большая и multiprocessing в ней лишь малая часть - потому сама она не в 4 раза, но всё-таки заметно прожорливей становится.

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

> убивать зависшие треды
Но зачем ты их завесываешь?

anonymous ()
Ответ на: комментарий от nitz

При обычном-то запуске (ведь тоже «каждый раз»)

Ты не понял. Процесс *уже* должен быть запущен и принимать данные на вычисление. Или через очередь или через Pool.

И да, сложность расчета должна быть больше оверхеда на IPC. По твоему кривому коду о чем-то судить невозможно.

baverman ★★★ ()

Если у тебя идёт интенсивный обмен инфой между «тредами» то будет всё проседать т.к. оно через pickle и shmem работает.

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

> Выполняет, просто я выбрал для примера части которые на мой взгляд могут быть причиной прожорливости multiprocessing-a (gobject, cairo)

То есть ты не показал в коде, что делает твоя программа, на словах этого тоже не объяснил, но чего-то ждешь? facepalm.jpg

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