diff --git a/QUIS SISTER 1/Chapter02-Audry/Barrier.py b/QUIS SISTER 1/Chapter02-Audry/Barrier.py new file mode 100644 index 0000000..eb15cdb --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Barrier.py @@ -0,0 +1,28 @@ +from random import randrange +from threading import Barrier, Thread +from time import ctime, sleep + +lomba = 4 +finish_line = Barrier(lomba) +nama_peserta = ['Audry', 'Bella', 'Vino', 'Lala'] + +def peserta(): + name = nama_peserta.pop() + sleep(randrange(2, 4)) + print(' %s mulai lomba melukis pada: %s \n' % (name, ctime())) + finish_line.wait() + print(' %s selesai melukis pada: %s \n' % (name, ctime())) + +def main(): + threads = [] + print('Mulai Lomba Melukis') + for i in range(lomba): + threads.append(Thread(target=peserta)) + threads[-1].start() + for thread in threads: + thread.join() + print('Selesai!') + + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/Chapter02-Audry/Condition.py b/QUIS SISTER 1/Chapter02-Audry/Condition.py new file mode 100644 index 0000000..06d9ae2 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Condition.py @@ -0,0 +1,70 @@ +import logging +import threading +import time + +LOG_FORMAT = '%(asctime)s %(threadName)-17s %(levelname)-8s %(message)s' +logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + +items = [] +condition = threading.Condition() + + +class Shopee(threading.Thread): + def _init_(self, *args, **kwargs): + super()._init_(*args, **kwargs) + + def membeli(self): + + with condition: + + if len(items) == 0: + logging.info('no items to checkout') + condition.wait() + + items.pop() + logging.info('chekout 1 item') + + condition.notify() + + def run(self): + for i in range(5): + time.sleep(1) + self.membeli() + + +class Lazada(threading.Thread): + def _init_(self, *args, **kwargs): + super()._init_(*args, **kwargs) + + def menjual(self): + + with condition: + + if len(items) == 5: + logging.info('checkout {} items. Stopped'.format(len(items))) + condition.wait() + + items.append(1) + logging.info('chekout {} items '.format(len(items))) + + condition.notify() + + def run(self): + for i in range(5): + time.sleep(1) + self.menjual() + + +def main(): + shopee = Shopee(name='shopee') + lazada = Lazada(name='lazada') + + shopee.start() + lazada.start() + + shopee.join() + lazada.join() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/QUIS SISTER 1/Chapter02-Audry/Event.py b/QUIS SISTER 1/Chapter02-Audry/Event.py new file mode 100644 index 0000000..f9adede --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Event.py @@ -0,0 +1,47 @@ +import logging +import threading +import time +import random + +LOG_FORMAT = '%(asctime)s %(threadName)-17s %(levelname)-8s %(message)s' +logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + +items = [] +event = threading.Event() + + +class Tokped(threading.Thread): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def run(self): + while True: + time.sleep(1) + event.wait() + item = items.pop() + logging.info('Tokped notify: {} dikelola oleh {}'\ + .format(item, self.name)) + +class Blibli(threading.Thread): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def run(self): + for i in range(3): + time.sleep(1) + item = random.randint(0, 10) + items.append(item) + logging.info('Blibli notify: item {} dikelola {}'\ + .format(item, self.name)) + event.set() + event.clear() + +if __name__ == "__main__": + t1 = Tokped() + t2 = Blibli() + + t1.start() + t2.start() + + t1.join() + t2.join() diff --git a/QUIS SISTER 1/Chapter02-Audry/MyThreadClass.py b/QUIS SISTER 1/Chapter02-Audry/MyThreadClass.py new file mode 100644 index 0000000..65db043 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/MyThreadClass.py @@ -0,0 +1,58 @@ +import time +import os +from random import randint +from threading import Thread + +class MyThreadClass (Thread): + def __init__(self, name, duration): + Thread.__init__(self) + self.name = name + self.duration = duration + def run(self): + print ("---> " + self.name + \ + " mulai ujian , Nomor Ujian "\ + + str(os.getpid()) + "\n") + time.sleep(self.duration) + print ("---> " + self.name + " Selesai\n") + + +def main(): + start_time = time.time() + + # Thread Creation + Audry1 = MyThreadClass("Audry ", randint(1,5)) + Artha2 = MyThreadClass("Artha ", randint(1,5)) + Lina3 = MyThreadClass("Lina ", randint(1,5)) + Jimin4 = MyThreadClass("Jimin ", randint(1,5)) + Wooyoung5 = MyThreadClass("Wooyoung ", randint(1,5)) + Haruto6 = MyThreadClass("Haruto ", randint(1,5)) + + # Thread Running + Audry1.start() + Artha2.start() + Lina3.start() + Jimin4.start() + Wooyoung5.start() + Haruto6.start() + + # Thread joining + Audry1.join() + Artha2.join() + Lina3.join() + Jimin4.join() + Wooyoung5.join() + Haruto6.join() + + # End + print("Ujian Selesai") + + #Execution Time + print("--- %s detik ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/Chapter02-Audry/MyThreadClass_lock.py b/QUIS SISTER 1/Chapter02-Audry/MyThreadClass_lock.py new file mode 100644 index 0000000..b19a596 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/MyThreadClass_lock.py @@ -0,0 +1,65 @@ +import threading +import time +import os +from threading import Thread +from random import randint + +# Lock Definition +threadLock = threading.Lock() + +class MyThreadClass (Thread): + def __init__(self, name, duration): + Thread.__init__(self) + self.name = name + self.duration = duration + def run(self): + #Acquire the Lock + threadLock.acquire() + print ("---> " + self.name + \ + " mulai presentasi, NPM: "\ + + str(os.getpid()) + "\n") + time.sleep(self.duration) + print ("---> " + self.name + " selesai \n") + #Release the Lock + threadLock.release() + + +def main(): + start_time = time.time() + # Thread Creation + Audry1 = MyThreadClass("Audry ", randint(1,5)) + Artha2 = MyThreadClass("Artha ", randint(1,5)) + Lina3 = MyThreadClass("Lina ", randint(1,5)) + Jimin4 = MyThreadClass("Jimin ", randint(1,5)) + Wooyoung5 = MyThreadClass("Wooyoung ", randint(1,5)) + Haruto6 = MyThreadClass("Haruto ", randint(1,5)) + + # Thread Running + Audry1.start() + Artha2.start() + Lina3.start() + Jimin4.start() + Wooyoung5.start() + Haruto6.start() + + # Thread joining + Audry1.join() + Artha2.join() + Lina3.join() + Jimin4.join() + Wooyoung5.join() + Haruto6.join() + + # End + print("The End") + + #Execution Time + print("--- %s seconds ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/Chapter02-Audry/MyThreadClass_lock_2.py b/QUIS SISTER 1/Chapter02-Audry/MyThreadClass_lock_2.py new file mode 100644 index 0000000..a1e00b1 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/MyThreadClass_lock_2.py @@ -0,0 +1,68 @@ +import threading +import time +import os +from threading import Thread +from random import randint + +# Lock Definition +threadLock = threading.Lock() + +class MyThreadClass (Thread): + def __init__(self, name, duration): + Thread.__init__(self) + self.name = name + self.duration = duration + def run(self): + #Acquire the Lock + threadLock.acquire() + print ("---> " + self.name + \ + " running games, ID games "\ + + str(os.getpid()) + "\n") + threadLock.release() + time.sleep(self.duration) + print ("---> " + self.name + " over\n") + #Release the Lock + + +def main(): + start_time = time.time() + + # Thread Creation + Audry1 = MyThreadClass("Audry ", randint(1,5)) + Artha2 = MyThreadClass("Artha ", randint(1,5)) + Lina3 = MyThreadClass("Lina ", randint(1,5)) + Jimin4 = MyThreadClass("Jimin ", randint(1,5)) + Wooyoung5 = MyThreadClass("Wooyoung ", randint(1,5)) + Haruto6 = MyThreadClass("Haruto ", randint(1,5)) + + + # Thread Running + Audry1.start() + Artha2.start() + Lina3.start() + Jimin4.start() + Wooyoung5.start() + Haruto6.start() + + + # Thread joining + Audry1.join() + Artha2.join() + Lina3.join() + Jimin4.join() + Wooyoung5.join() + Haruto6.join() + + # End + print("End") + + #Execution Time + print("--- %s detik ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/Chapter02-Audry/Rlock.py b/QUIS SISTER 1/Chapter02-Audry/Rlock.py new file mode 100644 index 0000000..c0528c7 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Rlock.py @@ -0,0 +1,58 @@ +import threading +import time +import random + + +class Box: + def _init_(self): + self.lock = threading.RLock() + self.total_items = 0 + + def execute(self, value): + with self.lock: + self.total_items += value + + def add(self): + with self.lock: + self.execute(1) + + def remove(self): + with self.lock: + self.execute(-1) + +def adder(box, items): + while items: + box.add() + time.sleep(1) + items -= 1 + print("ADDED one item -->{} item to ADD \n".format(items)) + + + +def remover(box, items): + while items: + box.remove() + time.sleep(1) + items -= 1 + print("REMOVED one item -->{} item to REMOVE \n".format(items)) + + +def main(): + items = 10 + box = Box() + + t1 = threading.Thread(target=adder, \ + args=(box, random.randint(10,20))) + t2 = threading.Thread(target=remover, \ + args=(box, random.randint(1,10))) + + t1.start() + t2.start() + + + t1.join() + t2.join() + + +if __name__ == "_main_": + main() \ No newline at end of file diff --git a/QUIS SISTER 1/Chapter02-Audry/Semaphore.py b/QUIS SISTER 1/Chapter02-Audry/Semaphore.py new file mode 100644 index 0000000..6e74127 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Semaphore.py @@ -0,0 +1,41 @@ +import logging +import threading +import time +import random + +LOG_FORMAT = '%(asctime)s %(threadName)-17s %(levelname)-8s %(message)s' +logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + + +semaphore = threading.Semaphore(0) +nomor = (0,10) + + +def daftar_siswa(): + logging.info('memanggil siswa') + semaphore.acquire() + logging.info('daftar siswa: nomor absen {}'.format(nomor)) + + +def kehadiran(): + global nomor + time.sleep(1) + nomor = random.randint(0, 10) + logging.info('periksa kehadiran: nomor absen {}'.format(nomor)) + semaphore.release() + + +def main(): + for i in range(5): + t1 = threading.Thread(target=daftar_siswa) + t2 = threading.Thread(target=kehadiran) + + t1.start() + t2.start() + + t1.join() + t2.join() + + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/Chapter02-Audry/Thread_definition.py b/QUIS SISTER 1/Chapter02-Audry/Thread_definition.py new file mode 100644 index 0000000..eb6dddb --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Thread_definition.py @@ -0,0 +1,18 @@ +import threading + + +def my_func(thread_number): + #return print('panggil fungsi N°{}'.format(thread_number)) + return print('Bilangan cacah : {} '.format(thread_number)) + + +def main(): + threads = [] + for i in range(10): + t = threading.Thread(target=my_func, args=(i, )) + threads.append(t) + t.start() + t.join() + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/Chapter02-Audry/Thread_determine.py b/QUIS SISTER 1/Chapter02-Audry/Thread_determine.py new file mode 100644 index 0000000..b05f7b6 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Thread_determine.py @@ -0,0 +1,30 @@ +import threading +import time + +def lomba(): + print (threading.currentThread().getName()+str('--> memulai lomba \n')) + + print (threading.currentThread().getName()+str( '--> lomba selesai \n')) + time.sleep(2) + return + +def pengumuman(): + print (threading.currentThread().getName()+str('--> mulai pengumuman \n')) + time.sleep(3) + print (threading.currentThread().getName()+str( '--> selesai \n')) + time.sleep(2) + return + + +if __name__ == "__main__": + + t1 = threading.Thread(name='lomba', target=lomba) + t2 = threading.Thread(name='pengumuman', target=pengumuman) + + + t1.start() + t2.start() + + t1.join() + t2.join() + diff --git a/QUIS SISTER 1/Chapter02-Audry/Thread_name_and_processes.py b/QUIS SISTER 1/Chapter02-Audry/Thread_name_and_processes.py new file mode 100644 index 0000000..443fa57 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Thread_name_and_processes.py @@ -0,0 +1,44 @@ +from threading import Thread +import time +import os + +class hewan (Thread): + def __init__(self, name): + Thread.__init__(self) + self.name = name + + def run(self): + print("Jenis-jenis hewan: {}".format(self.name)) + +def main(): + from random import randint + thread1 = hewan("Amfibi ") + thread2 = hewan("Mamalia") + thread3 = hewan("Aves") + thread4 = hewan("Reptil") + thread5 = hewan("Serangga") + + # memulai thread + thread1.start() + thread2.start() + thread3.start() + thread4.start() + thread5.start() + + # Thread joining and finish to join + thread1.join() + thread2.join() + thread3.join() + thread4.join() + thread5.join() + + #End + print("Sekian") + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/Chapter02-Audry/Threading_with_queue.py b/QUIS SISTER 1/Chapter02-Audry/Threading_with_queue.py new file mode 100644 index 0000000..bb32bd5 --- /dev/null +++ b/QUIS SISTER 1/Chapter02-Audry/Threading_with_queue.py @@ -0,0 +1,49 @@ +from threading import Thread +from queue import Queue +import time +import random + + +class Pemesanan(Thread): + + def _init_(self, queue): + Thread._init_(self) + self.queue = queue + + def run(self): + for i in range(3): + item = random.randint(0, 20) + self.queue.put(item) + print('Antrian pesanan : antrian nomor %d diproses oleh %s\n'\ + % (item, self.name)) + time.sleep(3) #membuat delay random selama 1-3 detik + + +class Pembayaran(Thread): + + def _init_(self, queue): + Thread._init_(self) + self.queue = queue + + def run(self): + while True: + item = self.queue.get() + print('Antrian pembayaran : antrian nomor %d muncul tagihan pembayaran dari %s'\ + % (item, self.name)) + self.queue.task_done() + +if __name__ == '_main_': + queue = Queue() + +#declare objek dari tiap kelas + t1 = Pemesanan(queue) #Thread untuk proses pemesanan + t2 = Pembayaran(queue) #Threat untuk proses pembayaran + +#mulai running threads + t1.start() + t2.start() +#tunggu proses selesai + t1.join() + t2.join() + + print("Selesai") \ No newline at end of file