test_threading2.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import sys
  2. from collections import deque
  3. from panda3d import core
  4. from direct.stdpy import threading2
  5. import pytest
  6. @pytest.mark.skipif(sys.platform == "emscripten", reason="No threading")
  7. @pytest.mark.skipif(not core.Thread.is_threading_supported(), reason="No threading")
  8. def test_threading2():
  9. class BoundedQueue(threading2._Verbose):
  10. def __init__(self, limit):
  11. threading2._Verbose.__init__(self)
  12. self.mon = threading2.RLock()
  13. self.rc = threading2.Condition(self.mon)
  14. self.wc = threading2.Condition(self.mon)
  15. self.limit = limit
  16. self.queue = deque()
  17. def put(self, item):
  18. self.mon.acquire()
  19. while len(self.queue) >= self.limit:
  20. self._note("put(%s): queue full", item)
  21. self.wc.wait()
  22. self.queue.append(item)
  23. self._note("put(%s): appended, length now %d",
  24. item, len(self.queue))
  25. self.rc.notify()
  26. self.mon.release()
  27. def get(self):
  28. self.mon.acquire()
  29. while not self.queue:
  30. self._note("get(): queue empty")
  31. self.rc.wait()
  32. item = self.queue.popleft()
  33. self._note("get(): got %s, %d left", item, len(self.queue))
  34. self.wc.notify()
  35. self.mon.release()
  36. return item
  37. class ProducerThread(threading2.Thread):
  38. def __init__(self, queue, quota):
  39. threading2.Thread.__init__(self, name="Producer")
  40. self.queue = queue
  41. self.quota = quota
  42. def run(self):
  43. from random import random
  44. counter = 0
  45. while counter < self.quota:
  46. counter = counter + 1
  47. self.queue.put("%s.%d" % (self.getName(), counter))
  48. core.Thread.sleep(random() * 0.00001)
  49. class ConsumerThread(threading2.Thread):
  50. def __init__(self, queue, count):
  51. threading2.Thread.__init__(self, name="Consumer")
  52. self.queue = queue
  53. self.count = count
  54. def run(self):
  55. while self.count > 0:
  56. item = self.queue.get()
  57. print(item)
  58. self.count = self.count - 1
  59. NP = 3
  60. QL = 4
  61. NI = 5
  62. Q = BoundedQueue(QL)
  63. P = []
  64. for i in range(NP):
  65. t = ProducerThread(Q, NI)
  66. t.setName("Producer-%d" % (i+1))
  67. P.append(t)
  68. C = ConsumerThread(Q, NI*NP)
  69. for t in P:
  70. t.start()
  71. core.Thread.sleep(0.000001)
  72. C.start()
  73. for t in P:
  74. t.join()
  75. C.join()