[Stackless-checkins] r54092 - in stackless/sandbox/examples/pyqt: producer-consumer producer-consumer/producer_consumer.py producer-consumer/producer_consumer_ui.py

richard.tew python-checkins at python.org
Fri Mar 2 23:12:55 CET 2007


Author: richard.tew
Date: Fri Mar  2 23:12:53 2007
New Revision: 54092

Added:
   stackless/sandbox/examples/pyqt/
   stackless/sandbox/examples/pyqt/producer-consumer/
   stackless/sandbox/examples/pyqt/producer-consumer/producer_consumer.py
   stackless/sandbox/examples/pyqt/producer-consumer/producer_consumer_ui.py
Log:
Committed Carlos Eduardo de Paula's PyQT example.

Added: stackless/sandbox/examples/pyqt/producer-consumer/producer_consumer.py
==============================================================================
--- (empty file)
+++ stackless/sandbox/examples/pyqt/producer-consumer/producer_consumer.py	Fri Mar  2 23:12:53 2007
@@ -0,0 +1,261 @@
+#
+# This is a small producer-consumer application integrated with PyQt.
+#
+# Author: Carlos Eduardo de Paula
+#
+# The application uses no threads, all is done by tasklets, simple but
+# is valid and can be extended.
+#
+# If you have any questions about this example, please feel free to
+# contact the Stackless mailing list.  You can subscribe at this
+# address:
+#
+#     http://www.tismer.com/mailman/listinfo/stackless
+#
+
+import stackless
+import time
+import random
+import sys
+from PyQt4 import QtGui, QtCore
+
+
+# Nice way to put the tasklet to sleep - from stackless.com wiki/Idioms
+##########################################################
+sleepingTasklets = []
+
+def Sleep(secondsToWait):
+    channel = stackless.channel()
+    endTime = time.time() + secondsToWait
+    sleepingTasklets.append((endTime, channel))
+    sleepingTasklets.sort()
+    # Block until we get sent an awakening notification.
+    channel.receive()
+
+def ManageSleepingTasklets():
+    while 1:
+        if len(sleepingTasklets):
+            endTime = sleepingTasklets[0][0]
+            if endTime <= time.time():
+                channel = sleepingTasklets[0][1]
+                del sleepingTasklets[0]
+                # We have to send something, but it doesn't matter what as it is not used.
+                channel.send(None)
+#            if len(sleepingTasklets) <= 0: time.sleep(endTime-time.time())
+        #time.sleep(0.001)
+        stackless.schedule()
+        if len(sleepingTasklets) <= 0: stackless.getcurrent().kill()
+
+#stackless.tasklet(ManageSleepingTasklets)()
+
+##########################################################
+
+class Agent(object):
+    def __init__(self, name=None):
+        self.ch = stackless.channel()
+        self.name = name
+        self.items = 0
+        self.kill = False
+        self.t = stackless.tasklet(self.runAction)()
+
+    def runAction(self):
+        while not self.kill:
+            self.action()
+
+    def action(self):
+        pass
+
+class Queue(object):
+    def __init__(self, name):
+        self.queue_start=0
+        self.qt = self.queue_start
+        self.max_size = 100
+        self.running = False
+        self.kill = False
+        self.produced = 0
+        self.consumed = 0
+        self.q_empty = 0
+        self.q_full = 0
+        self.producers = []
+        self.consumers = []
+
+    def put(self, qty=1, who=None):
+        if self.qt+qty < self.max_size:
+            self.qt += qty
+            self.produced += 1
+        else:
+            self.q_full += 1
+
+    def get(self, qty=1, who=None):
+        if self.qt >= qty:
+            self.qt -= qty
+            self.consumed += 1
+        else:
+            self.q_empty += 1
+
+
+class Producer(Agent):
+    def __init__(self,name, queue):
+        Agent.__init__(self, name)
+        self.time = random.random()
+        self.items = 0
+        self.queue = queue
+        self.queue.producers.append(self)
+
+    def action(self):
+        while self.queue.running:
+            if self.queue.qt < 5:
+                Sleep(self.time)
+            else:
+                Sleep(self.time*2)
+            self.queue.put(1, self.name)
+            self.items += 1
+        else:
+            Sleep(self.time)
+
+class Consumer(Agent):
+    def __init__(self, name, queue):
+        Agent.__init__(self, name)
+        self.time = random.random()
+        self.queue = queue
+        self.queue.consumers.append(self)
+    def action(self):
+        while self.queue.running:
+            self.queue.get(1, self.name)
+            self.items += 1
+            if self.queue.qt < 5:
+                Sleep(self.time*2)
+            else:
+                Sleep(self.time)
+        else:
+            Sleep(self.time)
+
+##########################################################################
+
+class mainWindow(QtGui.QMainWindow):
+    def __init__(self):
+        QtGui.QMainWindow.__init__(self)
+        from producer_consumer_ui import Ui_MainWindow
+        # Set up the user interface from Designer.
+        self.ui = Ui_MainWindow()
+        self.ui.setupUi(self)
+        self.connect(self.ui.start, QtCore.SIGNAL("clicked()"),self.start) # <- Button
+        self.connect(self.ui.stop, QtCore.SIGNAL("clicked()"),self.stop) # <- Button
+        self.connect(self.ui.add, QtCore.SIGNAL("clicked()"),self.addtoqueue) # <- Button
+        self.connect(self.ui.addprod, QtCore.SIGNAL("clicked()"),self.addprod) # <- Button
+        self.connect(self.ui.addcons, QtCore.SIGNAL("clicked()"),self.addcons) # <- Button
+
+        self.started = False
+        self.killtasks = False
+        self.q = Queue("Queue")
+        self.PID = 0
+        self.CID = 0
+
+    def closeEvent(self, event):
+        self.killtasks = True
+        try:
+            for p in self.q.producers:
+                p.kill = True
+            for c in self.q.consumers:
+                c.kill = True
+            self.sleepMan.kill()
+            self.showReport()
+        except: pass
+
+    def start(self):
+        if self.started: 
+            self.q.running = True
+            self.ui.statusbar.showMessage("Running")
+            return
+        self.ui.statusbar.showMessage("Starting up...")
+        self.started = True
+        self.q.running = True
+        self.sleepMan = stackless.tasklet(ManageSleepingTasklets)()
+        self.monit = stackless.tasklet(self.monitor)()
+        self.ui.queue.setMaximum(self.q.max_size)
+        
+        for i in range(num_prod):
+            self.addprod()
+
+        for i in range(num_cons):
+            self.addcons()       
+       
+        self.ui.statusbar.showMessage("Running")
+        stackless.run()
+        
+
+    def stop(self):
+        self.q.running = False
+        self.ui.statusbar.showMessage("Stopped")
+        
+    def addprod(self):
+        ID = self.PID
+        name = "P"+str(ID)
+        a = Producer(name, self.q)
+        self.PID += 1
+
+    def addcons(self):
+        ID = self.CID
+        name = "C"+str(ID)
+        a = Consumer(name, self.q)
+        self.CID += 1
+        
+    def addtoqueue(self):
+        self.q.qt += 10
+        
+    def monitor(self):
+        while not self.killtasks:
+            QtGui.QApplication.processEvents()
+            self.ui.queue.setValue(self.q.qt)
+            self.ui.prod.setText(str(len(self.q.producers)))
+            self.ui.cons.setText(str(len(self.q.consumers)))
+            Sleep(0.033)
+            #stackless.schedule()
+        
+    def showReport(self):
+        print
+        print "--------------------------"
+        for p in self.q.producers:
+            print "Producer", p.name , "produced: ", p.items, "items. Each production took: ", p.time
+        print
+        for c in self.q.consumers:
+            print "Consumer", c.name , "consumed: ", c.items, "items. Each consuption took: ", c.time
+        print "--------------------------"
+        print "Produced units: ", self.q.produced
+        print "Consumed units: ", self.q.consumed
+        print "Left in queue: ", self.q.qt
+        print
+        print "Queue became zero ", self.q.q_empty, " times."
+        print "Queue became full ", self.q.q_full, " times."
+        print
+        print "--------------------------"
+
+        
+
+###########################################################
+
+num_prod = 10                # Number of starting producers
+num_cons = 10                # Number of starting consumers
+
+
+def main(args):
+    app = QtGui.QApplication(sys.argv)
+    mainwindow = mainWindow()
+    mainwindow.show()
+    sys.exit(app.exec_())
+
+if __name__=="__main__":
+    main(sys.argv)
+
+
+
+
+
+
+
+
+
+
+
+
+

Added: stackless/sandbox/examples/pyqt/producer-consumer/producer_consumer_ui.py
==============================================================================
--- (empty file)
+++ stackless/sandbox/examples/pyqt/producer-consumer/producer_consumer_ui.py	Fri Mar  2 23:12:53 2007
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+
+# Used by producer_consumer.py
+
+# Form implementation generated from reading ui file 'prodcon_ui.ui'
+#
+# Created: Tue Aug 29 15:41:04 2006
+#      by: PyQt4 UI code generator 4-snapshot-20060814
+#
+# WARNING! All changes made in this file will be lost!
+
+import sys
+from PyQt4 import QtCore, QtGui
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(QtCore.QSize(QtCore.QRect(0,0,392,351).size()).expandedTo(MainWindow.minimumSizeHint()))
+
+        self.centralwidget = QtGui.QWidget(MainWindow)
+        self.centralwidget.setObjectName("centralwidget")
+
+        self.cons = QtGui.QLineEdit(self.centralwidget)
+        self.cons.setGeometry(QtCore.QRect(80,170,31,20))
+        self.cons.setObjectName("cons")
+
+        self.stop = QtGui.QPushButton(self.centralwidget)
+        self.stop.setGeometry(QtCore.QRect(60,70,75,23))
+        self.stop.setObjectName("stop")
+
+        self.start = QtGui.QPushButton(self.centralwidget)
+        self.start.setGeometry(QtCore.QRect(60,40,75,23))
+        self.start.setObjectName("start")
+
+        self.addprod = QtGui.QPushButton(self.centralwidget)
+        self.addprod.setGeometry(QtCore.QRect(270,160,75,23))
+        self.addprod.setObjectName("addprod")
+
+        self.label = QtGui.QLabel(self.centralwidget)
+        self.label.setGeometry(QtCore.QRect(20,150,48,14))
+        self.label.setObjectName("label")
+
+        self.prod = QtGui.QLineEdit(self.centralwidget)
+        self.prod.setGeometry(QtCore.QRect(80,150,31,20))
+        self.prod.setObjectName("prod")
+
+        self.addcons = QtGui.QPushButton(self.centralwidget)
+        self.addcons.setGeometry(QtCore.QRect(270,130,75,23))
+        self.addcons.setObjectName("addcons")
+
+        self.label_2 = QtGui.QLabel(self.centralwidget)
+        self.label_2.setGeometry(QtCore.QRect(20,171,53,14))
+        self.label_2.setObjectName("label_2")
+
+        self.add = QtGui.QPushButton(self.centralwidget)
+        self.add.setGeometry(QtCore.QRect(270,40,75,23))
+        self.add.setObjectName("add")
+
+        self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)
+        self.lcdNumber.setGeometry(QtCore.QRect(170,40,64,23))
+        self.lcdNumber.setObjectName("lcdNumber")
+
+        self.queue = QtGui.QProgressBar(self.centralwidget)
+        self.queue.setGeometry(QtCore.QRect(190,80,22,211))
+        self.queue.setMaximum(60)
+        self.queue.setProperty("value",QtCore.QVariant(0))
+        self.queue.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
+        self.queue.setOrientation(QtCore.Qt.Vertical)
+        self.queue.setInvertedAppearance(False)
+        self.queue.setTextDirection(QtGui.QProgressBar.TopToBottom)
+        self.queue.setObjectName("queue")
+        MainWindow.setCentralWidget(self.centralwidget)
+
+        self.menubar = QtGui.QMenuBar(MainWindow)
+        self.menubar.setGeometry(QtCore.QRect(0,0,392,21))
+        self.menubar.setObjectName("menubar")
+        MainWindow.setMenuBar(self.menubar)
+
+        self.statusbar = QtGui.QStatusBar(MainWindow)
+        self.statusbar.setObjectName("statusbar")
+        MainWindow.setStatusBar(self.statusbar)
+
+        self.retranslateUi(MainWindow)
+        QtCore.QObject.connect(self.queue,QtCore.SIGNAL("valueChanged(int)"),self.lcdNumber.display)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
+        self.stop.setText(QtGui.QApplication.translate("MainWindow", "Stop", None, QtGui.QApplication.UnicodeUTF8))
+        self.start.setText(QtGui.QApplication.translate("MainWindow", "Start", None, QtGui.QApplication.UnicodeUTF8))
+        self.addprod.setText(QtGui.QApplication.translate("MainWindow", "+ Prod", None, QtGui.QApplication.UnicodeUTF8))
+        self.label.setText(QtGui.QApplication.translate("MainWindow", "Producers", None, QtGui.QApplication.UnicodeUTF8))
+        self.addcons.setText(QtGui.QApplication.translate("MainWindow", "+ Cons", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Consumers", None, QtGui.QApplication.UnicodeUTF8))
+        self.add.setText(QtGui.QApplication.translate("MainWindow", "+10", None, QtGui.QApplication.UnicodeUTF8))

_______________________________________________
Stackless-checkins mailing list
Stackless-checkins at stackless.com
http://www.stackless.com/mailman/listinfo/stackless-checkins



More information about the Stackless-checkins mailing list