TelenkovDmitry 1 rok temu
rodzic
commit
6c1b8cf7a5

+ 0 - 56
courses/python_threading/les_1.py → courses/python_threading/base_thread.py

@@ -133,59 +133,3 @@ start_data_threads()
 
 
 
-'''
-def get_data_1(data):
-    while True:
-        print(f"[{threading.current_thread().name}] - {data}")
-        time.sleep(3)
-
-def get_data_2(data, value):
-    for _ in range(value):
-        print(f"[{threading.current_thread().name}] - {data}")
-        time.sleep(1)
-
-# thr = threading.Thread(target=get_data, args=(str(time.time()), ), name="thr-1" )
-# thr.start()                
-
-
-def thr_join():
-
-    thr_list = []
-
-    for i in range(3):
-        thr = threading.Thread(target=get_data_2, args=(str(time.time()), i,), name=f"thr-{i}" )
-        thr_list.append(thr)
-        thr.start()                
-
-    for i in thr_list:
-        i.join()
-
-    print("finish")
-
-
-
-def set_name():
-    print("name:", threading.main_thread().name)
-    threading.main_thread().setName("maint_thread_new_name")
-    print("result:", threading.main_thread().name)
-
-
-def print_thread_params():
-    for i in range(100):
-        print(f"current: {i}")
-        time.sleep(1)
-
-        if i%10 == 0:
-            # количество активных потоков
-            print("active thread:", threading.active_count())
-
-            # выводит все запущенные потоки
-            print("enumerate:", threading.enumerate())
-
-            # работает ли поток в данный момент
-            print("thr-1 is active", thr.is_alive())
-
-
-thr_join()
-
-'''

+ 60 - 0
courses/python_threading/condition.py

@@ -0,0 +1,60 @@
+import threading
+import time
+
+event = threading.Event()
+
+def test():
+    while True:
+        event.wait()
+        print("test")
+        time.sleep(2)
+
+def start_event_thread_1():
+    event.clear()
+    threading.Thread(target=test, daemon=True).start()
+    time.sleep(3)
+    event.set()
+
+    while True:
+        pass
+
+### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+def image_handler():
+    thr_num = threading.current_thread().name
+    print(f"Идет подготовка изображения из потока [{thr_num}]")
+    event.wait()
+    print("Изображение оправлено")    
+
+def start_event_thread_2():
+    for i in range(10):
+        threading.Thread(target=image_handler, name=str(i)).start()
+        print(f'Поток [{i}] запущен!')
+        time.sleep(1)
+
+
+    if threading.active_count() > 10:
+        event.set()
+
+
+### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+cond = threading.Condition()
+
+def f1():
+    while True:
+        with cond:
+            cond.wait()
+            print("Получил событие!")
+
+def f2():
+    for i in range(100):
+        if 1 % 10 == 0:
+            with cond:
+                cond.notify()
+        else:
+            print(f"f1: {i}")
+        time.sleep(1)
+
+threading.Thread(target=f1).start()
+threading.Thread(target=f2).start()

+ 36 - 0
courses/python_threading/sem.py

@@ -0,0 +1,36 @@
+### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+### Семафоры и барьеры
+
+from threading import Thread, BoundedSemaphore, current_thread, Barrier
+import time
+import random
+
+max_connections = 5
+pool = BoundedSemaphore(value=max_connections)
+
+def test():
+    with pool:
+        slp = random.randint(1, 5)
+        print(f"{current_thread().name} - sleep ({slp})")
+        time.sleep(slp) 
+
+# for i in range(10):
+#     Thread(target=test, name=f'Thr-{i}').start()
+
+
+
+### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+### Барьеры
+
+def test_barrier(barrier):
+    slp = random.randint(3, 7)
+    time.sleep(slp)
+    print(f"Поток [{current_thread().name}] запущен в ({time.ctime()})")
+    
+    barrier.wait()
+    print(f"Поток [{current_thread().name}] преодолел барьер в ({time.ctime()})")
+
+bar = Barrier(5)
+for i in range(5):
+    Thread(target=test_barrier, args=(bar, ), name=f"Thread-{i}").start()
+