test_threading2.py 2.4 KB

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