====== MultiProcessExecution 01V00 =====
[[http://www.openhardsoftware.de/ | Open Hard- & Software]]
[
[[http://www.openhardsoftware.de/dokuwiki | DokuWiki]]
[[http://www.openhardsoftware.de/websites | WebSites]]
[[http://www.openhardsoftware.de/mediawiki | MediaWiki]]
[[http://www.openhardsoftware.de/nextcloud | NextCloud]]
]
===== Übersicht =====
**CountUp.py** und **CountDown.py** sind zwei Python-Scripts, welche
* als Dateien im Esp32-MicroPython-FileSystem vorhanden sind und
* jeweils in einem eigenen Thread PARALLEL ablaufen und
* dabei auf eine (globale) System-Ressource (Counter in System.py) R/W-zugreifen.
===== Benutzung =====
VSCode-MicroPython-Terminal:
>>>
*** Check Esp32MultiProcessExecution: begin
CBOnStart[CU]
CBOnBusy[CU]
*** Check CountUp: begin
CountUp---System.Counter[1]
CBOnStart[CD]
CBOnBusy[CD]
*** Check CountDown: begin
CountDown-System.Counter[0]
CountUp---System.Counter[1]
CountUp---System.Counter[2]
CountDown-System.Counter[1]
CountUp---System.Counter[2]
CountDown-System.Counter[1]
CountUp---System.Counter[2]
CountUp---System.Counter[3]
CountDown-System.Counter[2]
CountUp---System.Counter[3]
CountDown-System.Counter[2]
CountUp---System.Counter[3]
CountUp---System.Counter[4]
CountDown-System.Counter[3]
CountUp---System.Counter[4]
CountDown-System.Counter[3]
*** Check CountUp: end
CBOnEnd[CU]
CountDown-System.Counter[2]
CountDown-System.Counter[1]
CountDown-System.Counter[0]
*** Check CountDown: end
CBOnEnd[CD]
CBOnAbort[CU]
CBOnAbort[CD]
*** Check Esp32MultiProcessExecution: end
>>>
Globale System-Ressourcen **System.py**
#
# Global - Variable
#--------------------------------------------------------------
Counter = 0
#
Hauptmodul **Esp32MultiProcessExecution.py**
#
import time
#
import Process as PRC
#
#---------------------------------------------------------------------
# Main
#---------------------------------------------------------------------
if ('__main__' == __name__):
#
print('*** Check Esp32MultiProcessExecution: begin')
#
ProcessCU = PRC.CProcess('CU', 'CountUp.py')
ProcessCD = PRC.CProcess('CD', 'CountDown.py')
ProcessCU.Start()
time.sleep(0.1)
ProcessCD.Start()
time.sleep(3.0)
ProcessCU.Abort()
ProcessCD.Abort()
#
print('*** Check Esp32MultiProcessExecution: end')
#
ChildProcess **CountUp.py**
#
import time
#
import System
#
#-----------------------------------------------------------
# Main
#-----------------------------------------------------------
if ('__main__' == __name__):
#
print('*** Check CountUp: begin')
#
for I in range(0, 10):
System.Counter += 1
print('CountUp---System.Counter[{}]'.format(System.Counter))
time.sleep(0.1)
#
print('*** Check CountUp: end')
#
#
ChildProcess **CountDown.py**
#
import time
#
import System
#
#-----------------------------------------------------------
# Main
#-----------------------------------------------------------
if ('__main__' == __name__):
#
print('*** Check CountDown: begin')
#
for I in range(0, 10):
System.Counter -= 1
print('CountDown-System.Counter[{}]'.format(System.Counter))
time.sleep(0.15)
#
print('*** Check CountDown: end')
#
#
Library **Process.py**
import time
#
import Thread as THR
#
class CProcess():
#
def __init__(self, processid, filename):
self.ID = processid
self.Filename = filename
self.Thread = THR.CThread(self.CBOnStart, self.CBOnBusy, \
self.CBOnAbort, self.CBOnEnd)
#
def CBOnStart(self, thread):
print('CBOnStart[{}]'.format(self.ID))
return
def CBOnBusy(self, thread):
print('CBOnBusy[{}]'.format(self.ID))
execfile(self.Filename)
return
def CBOnAbort(self, thread):
print('CBOnAbort[{}]'.format(self.ID))
return
def CBOnEnd(self, thread):
print('CBOnEnd[{}]'.format(self.ID))
return
#
def GetID(self):
return self.ID
#
def Start(self):
self.Thread.Start()
#
def Abort(self):
self.Thread.Abort()
#
#
Library **Thread.py**
import time
import _thread
#
# States
stIdle = 0
stBusy = 1
stEnd = 2
#
class CThread():
#
def __init__(self, onstart, onbusy, onabort, onend):
self.State = stIdle
self.Thread = None
self.OnStart = onstart
self.OnBusy = onbusy
self.OnAbort = onabort
self.OnEnd = onend
return
#
def Start(self):
self.State = stBusy
if (None != self.OnStart):
self.OnStart(self)
self.ThreadID = _thread.start_new_thread(self.CBOnExecute, [self])
return
#
def Abort(self):
self.State = stEnd
if (None != self.OnAbort):
self.OnAbort(self)
return
#
def CBOnExecute(self, thread):
if (None != self.OnBusy):
self.OnBusy(self)
if (None != self.OnEnd):
self.OnEnd(self)
return
#
#
===== Version =====
{{:module:micropython:MultiProcessExecution:2112141638_MultiProcessExecution_01V01.zip|2112141638_MultiProcessExecution_01V01.zip}}
-----
[[http://www.openhardsoftware.de/ | Open Hard- & Software]]
[
[[http://www.openhardsoftware.de/dokuwiki | DokuWiki]]
[[http://www.openhardsoftware.de/websites | WebSites]]
[[http://www.openhardsoftware.de/mediawiki | MediaWiki]]
[[http://www.openhardsoftware.de/nextcloud | NextCloud]]
]