Skip to content

Commit 4e83ca8

Browse files
committed
add singleton threaded sample Node
1 parent bd6025c commit 4e83ca8

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from PyFlow.Core import NodeBase
2+
from PyFlow.Core.NodeBase import NodePinsSuggestionsHelper
3+
from PyFlow.Core.Common import *
4+
5+
import threading
6+
7+
import time
8+
9+
@SingletonDecorator
10+
class singletonThread():
11+
isRunning = False
12+
instanceCount = 0
13+
def __init__(self):
14+
self.Runner = threading.Thread(target=self.run_loop, daemon=True)
15+
self.value = 0
16+
if not self.isRunning:
17+
self.Runner.start()
18+
self.isRunning = True
19+
20+
def run_loop(self):
21+
self.isRunning = True
22+
while self.isRunning:
23+
time.sleep(0.1)
24+
print("running")
25+
self.value +=1
26+
27+
def cleanUp(self):
28+
print(self.instanceCount)
29+
self.instanceCount -= 1
30+
if self.instanceCount == 0:
31+
self.isRunning = False
32+
self.Runner.join()
33+
del self
34+
print("cleanUp")
35+
36+
class singletonThreadSampleNode(NodeBase):
37+
def __init__(self, name):
38+
super(singletonThreadSampleNode, self).__init__(name)
39+
self.singletonThread = None
40+
self.value = self.createOutputPin('value', 'IntPin')
41+
42+
def postCreate(self, jsonTemplate=None):
43+
self.singletonThread = singletonThread()
44+
if not self.singletonThread.isRunning:
45+
self.singletonThread.Runner = threading.Thread(target=self.singletonThread.run_loop, daemon=True)
46+
self.singletonThread.Runner.start()
47+
self.bCacheEnabled = False
48+
super(singletonThreadSampleNode, self).postCreate(jsonTemplate=jsonTemplate)
49+
50+
@staticmethod
51+
def pinTypeHints():
52+
helper = NodePinsSuggestionsHelper()
53+
helper.addInputDataType('StringPin')
54+
helper.addOutputDataType('AnyPin')
55+
helper.addInputStruct(StructureType.Single)
56+
helper.addOutputStruct(StructureType.Dict)
57+
return helper
58+
59+
@staticmethod
60+
def category():
61+
return 'Interactive singletonThreads'
62+
63+
@staticmethod
64+
def keywords():
65+
return []
66+
67+
@staticmethod
68+
def description():
69+
return "Get singletonThreadSampleNode Infos."
70+
71+
def kill(self, *args, **kwargs):
72+
print("deleting singletonThreadSampleNode")
73+
self.singletonThread.cleanUp()
74+
super(singletonThreadSampleNode, self).kill(*args, **kwargs)
75+
76+
def compute(self, *args, **kwargs):
77+
if not self.singletonThread.isRunning:
78+
self.singletonThread.Runner = threading.Thread(target=self.singletonThread.run_loop, daemon=True)
79+
self.singletonThread.Runner.start()
80+
self.value.setData(self.singletonThread.value)

PyFlow/Packages/PyFlowBase/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
from PyFlow.Packages.PyFlowBase.Nodes.colorRamp import colorRamp
6464
from PyFlow.Packages.PyFlowBase.Nodes.stringToArray import stringToArray
6565
from PyFlow.Packages.PyFlowBase.Nodes.cliexit import cliexit
66-
66+
from PyFlow.Packages.PyFlowBase.Nodes.singletonThreadSampleNode import singletonThreadSampleNode
6767

6868
from PyFlow.Packages.PyFlowBase.Nodes.consoleOutput import consoleOutput
6969
from PyFlow.Packages.PyFlowBase.Nodes.address import address
@@ -173,6 +173,7 @@
173173
stringToArray.__name__: stringToArray,
174174
imageDisplay.__name__: imageDisplay,
175175
cliexit.__name__: cliexit,
176+
singletonThreadSampleNode.__name__: singletonThreadSampleNode,
176177
}
177178

178179
_PINS = {

0 commit comments

Comments
 (0)