base_thread.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import time
  2. import threading
  3. ### Базовое использование потоков
  4. def get_data_1(data):
  5. while True:
  6. print(f"<< вывод из другого потока {threading.current_thread().name} - {data}>>")
  7. time.sleep(1)
  8. data = str(time.time())
  9. def thread_test_1():
  10. thr = threading.Thread(target=get_data_1, args=(str(time.time()), ), name="Thr-1")
  11. thr.start()
  12. ite = 0
  13. while True:
  14. time.sleep(3)
  15. print(f"\n\n Вывод №{(ite:= ite+1)}: ")
  16. print(f"Наш личный поток работает?: {thr.is_alive()}")
  17. for ind, val in enumerate(threading.enumerate()):
  18. print(f"\t Активный поток №{ind+1}: {val}")
  19. print("\n\n")
  20. ### Демонстрация выполнения ТОЛЬКО по завершению работы (ф-я join)
  21. def get_data_2(data, value):
  22. for _ in range(value):
  23. print(f"<{threading.current_thread().name} - d:{data}, v:{value}> ")
  24. time.sleep(1)
  25. def thread_test_2():
  26. start_val, end_val = 1, 5
  27. # создаем функцию которая создает потоки
  28. tc = lambda x: threading.Thread(target=get_data_2, args=(str(time.time()), x,), name=f"thr-{x}", daemon=True)
  29. # создаем список потоков
  30. thr_list = [tc(x) for x in range(start_val, end_val + 1)]
  31. # запускаем потоки
  32. [x.start() for x in thr_list]
  33. # Ждем пока они завершаться (программа не дойдет до финиша, пока все потоки не завершат раобту)
  34. for i in thr_list:
  35. i.join()
  36. print("finish")
  37. # thread_test_2()
  38. ### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  39. ### Синхронизация потоков. Блокировка отоков.z
  40. # value = 0
  41. # locker = threading.Lock() # locker может использовать любой поток
  42. # rlocker = threading.RLock() # может разблокировать только тот поток, который вызвал блокировку
  43. def inc_value():
  44. global value
  45. while True:
  46. locker.acquire()
  47. value += 1
  48. print(value)
  49. time.sleep(1)
  50. locker.release()
  51. def inc_value_with():
  52. global value
  53. while True:
  54. with locker:
  55. value += 1
  56. print(value)
  57. time.sleep(0.1)
  58. locker.release()
  59. # for _ in range(5):
  60. # threading.Thread(target=inc_value).start()
  61. ### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  62. ### Таймеры
  63. def timer_output():
  64. while True:
  65. print("test")
  66. time.sleep(1)
  67. def timer_start():
  68. thr = threading.Timer(5, timer_output)
  69. thr.daemon = True # Поток будет завершен после завершения основого потока
  70. thr.start()
  71. # thr.cancel() # отменить поток
  72. while True:
  73. print("main")
  74. time.sleep(1)
  75. # timer_start()
  76. ### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  77. ### local Хранение данных и атрибуты
  78. data = threading.local()
  79. def get_data():
  80. print(data.value)
  81. def data_thread_1():
  82. data.value = 111
  83. get_data()
  84. print("t1:", data.value)
  85. def data_thread_2():
  86. data.value = 222
  87. get_data()
  88. print("t2:", data.value)
  89. def start_data_threads():
  90. threading.Thread(target=data_thread_1).start()
  91. threading.Thread(target=data_thread_2).start()
  92. start_data_threads()