Удалить фирменные драйверы Nvidia?

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

Поскольку это так часто, существует также python встроенное решение (в 3.2, но backported здесь: http://pypi.python.org/pypi/futures), называемое concurrent.futures. «Фьючерсы» доступны на многих языках, поэтому питон называет их одинаковыми. Вот типичные вызовы (и вот ваш полный пример, однако, часть db заменяется на сон, см. Ниже почему).

from concurrent import futures
executor = futures.ProcessPoolExecutor(max_workers=1)
#executor = futures.ThreadPoolExecutor(max_workers=1)
future = executor.submit(slow_load)
future.add_done_callback(self.on_complete)

Теперь к вашей проблеме, которая намного сложнее, чем предлагает ваш простой пример. В общем, у вас есть потоки или процессы для решения этой проблемы, но вот почему ваш пример настолько сложный:

Большинство реализаций на Python имеют GIL, что делает потоки не полностью использующими multicores. Итак: не используйте потоки с python! Объекты, которые вы хотите вернуть в slow_load из БД, не подбираются, что означает, что они не могут просто передаваться между процессами. Итак: нет многопроцессорности с результатами программного центра! Библиотека, которую вы вызываете (softwarecenter.db), не является потокобезопасной (кажется, включает в себя gtk или аналогичную), поэтому вызов этих методов в потоке приводит к странному поведению (в моем тесте все от «работает» над «дампом ядра» до простого отказ от результатов). Итак: нет потоков с программным центром. Каждый асинхронный обратный вызов в gtk не должен делать ничего, кроме того, что нужно отсылать обратный вызов, который будет вызываться в glib mainloop. Итак: no print, никаких изменений состояния gtk, кроме добавления обратного вызова! Gtk и так не работают с потоками из коробки. Вам нужно сделать threads_init, и если вы вызываете метод gtk или подобный, вы должны защитить этот метод (в более ранних версиях это были gtk.gdk.threads_enter(), gtk.gdk.threads_leave(). См., Например, gstreamer: http: //pygstdocs.berlios .de / pygst-учебник / playbin.html).

Я могу дать вам следующее предложение:

Большинство реализаций на Python имеют GIL, что делает потоки не полностью использующими multicores. Итак: не используйте потоки с python! Переключитесь с softwarecenter на python-apt или аналогичные (вам, вероятно, это не нравится). Но так как вы наняли Canonical, вы могли бы попросить разработчиков программного обеспечения непосредственно not к их программному обеспечению (например, заявив, что он не является потокобезопасным) и даже лучше, делая программный центр потокобезопасным.

В качестве примечания: решения, заданные другими (Gio.io_scheduler_push_job, async_call), работают с time.sleep, но не с softwarecenter.db. Это потому, что все это сводится к потокам, процессам и потокам, которые не работают с gtk и softwarecenter.

1
задан 6 November 2012 в 01:39

0 ответов

Другие вопросы по тегам:

Похожие вопросы: