Queue über C-Modul füllen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Queue über C-Modul füllen

Beitragvon droptix » Samstag 26. April 2008, 09:41

Möchte ein C-Modul für Python schreiben, um Windows-Events zu überwachen (nicht mit WMI). Das C-Modul soll wie Pythons `Queue.Queue()` funktionieren und jedes aufgeschnappte Event in die Queue speichern. Aus Python heraus möchte ich dann regulär über `get()` jeden Eintrag abarbeiten und auswerten. Ach ja: von den Methoden `join()` und `task_done()` (seit Python 2.5) würde ich auch gern profitieren.

Wichtig ist eben, dass die Event-Erkennung über C läuft, weil z.B. WMI hier zu lahm ist und einige Sachen übersieht (wegen Polling), v.a. wenn der Rechner gerade ausgelastet ist.

Meinem C-Modul möchte ich noch folgende Methoden auf den weg geben:
    - load(): lädt benötigte Bibliotheken
    - unload(): entlädt diese wieder
    - start(): aktiviert die Überwachung, d.h. erkannte Events werden in die Queue eingetragen
    - stop(): deaktiviert die Überwachung, d.h. erkannte Events werden ignoriert
    - run(): die Überwachung selbst

Nun reichen meine C-Kenntnisse nicht aus, und dazu kommt noch dass ich bislang nur ein wenig mit Python und C-Modulen herum experimentiert habe (nur simple Beispiele).

Daher wollte ich nachfragen, ob mir jemand unter die Arme greifen könnte und für das folgende Beispiel ein Code-Gerüst in C vorschlagen würde.

In Python würde ich mir das so vorstellen:

Code: Alles auswählen

import Queue

class MyCModule(Queue.Queue):
   """a Python `Queue.Queue()` like object in C"""
   __loaded = False
   """status if loaded or not"""
   __active = False
   """status if active or not"""
   
   def __init__(self):
      self.load()
   
   def load(self):
      """loads some libraries"""
      try:
         # C code here to load libraries
         self.__loaded = True
         return True
      except:
         return False
   
   def unload(self):
      """unloads libraries"""
      try:
         # C code here to unload libraries
         self.__loaded = False
         return True
      except:
         return False
   
   def start(self):
      self.__active = True
   
   def stop(self):
      self.__active = False
   
   def run(self):
      """fills the queue (if active)"""
      if self.__active:
         # C code here to fill the queue
         pass
BlackJack

Beitragvon BlackJack » Samstag 26. April 2008, 10:46

Ich würde da ja Pyrex bzw. besser Cython vorschlagen, oder die Klasse in Python schreiben und die C-Teile mit `ctypes` einbinden.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Samstag 26. April 2008, 11:04

Ist `ctypes` nicht relativ lahm? Cython ist recht interessant, aber wieder neu für mich. In Python und C-Module hatte ich mich grad ein wenig eingearbeitet... es ist ja kein Riesen-Modul, daher dachte ich an den üblichen und "sauberen" Weg über ein komplett compiliertes C-Modul als Windows-DLL, die in .pyd umbenannt wird.

Eine meiner Hauptfragen ist auch, ob ich überhaupt in meinem C-Modul von Pythons `Queue.Queue` erben bzw. es als BaseClass verwenden kann oder ob ich das komplett nachbilden müsste.

Gibt's hier jemanden im Python-Forum, der sowas überhaupt schonmal gemacht hat, also eine bestimmte Funktion in C auslagern... oder noch spezieller: eine Windows-spezifische Sache in C programmieren und dann für Python als C-Modul bereit stellen???
BlackJack

Beitragvon BlackJack » Samstag 26. April 2008, 11:21

Warum sollte `ctypes` lahm sein? Und ist die Geschwindigkeit der nicht letztlich egal? Du betreibst ja kein Polling mehr, also geht auch nichts verloren.

Ich würde erst einmal so viel wie möglich in Python schreiben und dann schauen ob man es noch irgendwie beschleunigen muss.

Pyrex/Cython würde ich als den "saubereren" Weg betrachten eine "C-Erweiterung" für Python zu schreiben, weil einem dann der ganze "boiler plate"-Code mit Referenzzählen und Ausnahmen abgenommen wird. Wenn man das per Hand schreibt, vergisst man gerne auch mal etwas.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]