diff --git a/QUIS SISTER 1/1194005_Chapter02/Barrier.py b/QUIS SISTER 1/1194005_Chapter02/Barrier.py new file mode 100644 index 0000000..fa11b11 --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/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 = ['Artha', 'Glory', 'Romey'] + +def peserta(): + name = nama_peserta.pop() + sleep(randrange(2, 4)) + print(' %s mulai olahraga pada: %s \n' % (name, ctime())) + finish_line.wait() + print(' %s selesai olahraga pada: %s \n' % (name, ctime())) + +def main(): + threads = [] + print('Mulai olahraga ') + for i in range(lomba): + threads.append(Thread(target=peserta)) + threads[-1].start() + for thread in threads: + thread.join() + print('Selesai Olahraga!') + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/QUIS SISTER 1/1194005_Chapter02/Condition.py b/QUIS SISTER 1/1194005_Chapter02/Condition.py new file mode 100644 index 0000000..036deca --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/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() diff --git a/QUIS SISTER 1/1194005_Chapter02/Event.py b/QUIS SISTER 1/1194005_Chapter02/Event.py new file mode 100644 index 0000000..8454741 --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/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(5): + 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/1194005_Chapter02/MyThreadClass.py b/QUIS SISTER 1/1194005_Chapter02/MyThreadClass.py new file mode 100644 index 0000000..2b63782 --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/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 presentasi, NPM "\ + + str(os.getpid()) + "\n") + time.sleep(self.duration) + print ("---> " + self.name + " melakukan presentasi\n") + + +def main(): + start_time = time.time() + + # Thread Creation + Audry1 = MyThreadClass("Audry ", randint(6,10)) + Artha2 = MyThreadClass("Artha ", randint(6,10)) + Lina3 = MyThreadClass("Lina ", randint(6,10)) + Jimin4 = MyThreadClass("Jimin ", randint(6,10)) + Wooyoung5 = MyThreadClass("Wooyoung ", randint(6,10)) + Haruto6 = MyThreadClass("Haruto ", randint(6,10)) + + # 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("--- waktu presentasi %s seconds ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194005_Chapter02/MyThreadClass_lock.py b/QUIS SISTER 1/1194005_Chapter02/MyThreadClass_lock.py new file mode 100644 index 0000000..2ac7d0a --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/MyThreadClass_lock.py @@ -0,0 +1,66 @@ +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 Ujian, Nomor Ujian "\ + + str(os.getpid()) + "\n") + time.sleep(self.duration) + print ("---> " + self.name + " Selamat mengerjakan\n") + #Release the Lock + threadLock.release() + + +def main(): + start_time = time.time() + # Thread Creation + Audry1 = MyThreadClass("Audry ", randint(6,10)) + Artha2 = MyThreadClass("Artha ", randint(6,10)) + Lina3 = MyThreadClass("Lina ", randint(6,10)) + Jimin4 = MyThreadClass("Jimin ", randint(6,10)) + Wooyoung5 = MyThreadClass("Wooyoung ", randint(6,10)) + Haruto6 = MyThreadClass("Haruto ", randint(6,10)) + + # 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("Selesai Ujian") + + #Execution Time + print("--- waktu ujian %s seconds ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194005_Chapter02/MyThreadClass_lock_2.py b/QUIS SISTER 1/1194005_Chapter02/MyThreadClass_lock_2.py new file mode 100644 index 0000000..39315bb --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/MyThreadClass_lock_2.py @@ -0,0 +1,67 @@ +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 seconds ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194005_Chapter02/Rlock.py b/QUIS SISTER 1/1194005_Chapter02/Rlock.py new file mode 100644 index 0000000..96f416b --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/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 1 item ke Chart -->{} item to Chart \n".format(items)) + + + +def remover(box, items): + while items: + box.remove() + time.sleep(1) + items -= 1 + print("REMOVED one item dari Chart -->{} item to Chart \n".format(items)) + + +def main(): + items = 10 + box = Box() + + t1 = threading.Thread(target=adder, \ + args=(box, random.randint(1,10))) + t2 = threading.Thread(target=remover, \ + args=(box, random.randint(1,10))) + + t1.start() + t2.start() + + + t1.join() + t2.join() + + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/1194005_Chapter02/Semaphore.py b/QUIS SISTER 1/1194005_Chapter02/Semaphore.py new file mode 100644 index 0000000..4a973af --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/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() \ No newline at end of file diff --git a/QUIS SISTER 1/1194005_Chapter02/Thread_definition.py b/QUIS SISTER 1/1194005_Chapter02/Thread_definition.py new file mode 100644 index 0000000..3c168cd --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/Thread_definition.py @@ -0,0 +1,18 @@ +import threading + + +def my_func(thread_number): + return print('panggil fungsi {}'.format(thread_number)) +# menampilkan informasi thread + + +def main(): + threads = [] + for i in range(5): + 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/1194005_Chapter02/Thread_determine.py b/QUIS SISTER 1/1194005_Chapter02/Thread_determine.py new file mode 100644 index 0000000..a5f1805 --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/Thread_determine.py @@ -0,0 +1,29 @@ +import threading +import time + +def seminar(): + print (threading.currentThread().getName()+str('--> penjelasan materi \n')) + time.sleep(5) + print (threading.currentThread().getName()+str( '--> materi selesai \n')) + time.sleep(2) + return + +def tanya_jawab(): + print (threading.currentThread().getName()+str('--> mulai sesi tanya jawab \n')) + time.sleep(5) + print (threading.currentThread().getName()+str( '--> selesai \n')) + time.sleep(2) + return + + +if __name__ == "__main__": + + t1 = threading.Thread(name='seminar', target=seminar) + t2 = threading.Thread(name='tanya_jawab', target=tanya_jawab) + + t1.start() + t2.start() + + t1.join() + t2.join() + diff --git a/QUIS SISTER 1/1194005_Chapter02/Thread_name_and_processes.py b/QUIS SISTER 1/1194005_Chapter02/Thread_name_and_processes.py new file mode 100644 index 0000000..566d6b4 --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/Thread_name_and_processes.py @@ -0,0 +1,40 @@ +from threading import Thread +import time +import os + +class takjil (Thread): #thread itu modul didalam treading + def __init__(self, name): + Thread.__init__(self) + self.name = name + + def run(self): + print("buka puasa enaknya makan {}".format(self.name)) + +def main(): + from random import randint + # Delcare object of takjil class + thread1 = takjil("es buah ") + thread2 = takjil("es kelapa ") + thread3 = takjil("nasi padang") + + # Thread Running + thread1.start() + thread2.start() + thread3.start() + + + # Thread joining and finish to join + thread1.join() + thread2.join() + thread3.join() + + # End + print("Selamat berpuasa") + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194005_Chapter02/Threading_with_queue.py b/QUIS SISTER 1/1194005_Chapter02/Threading_with_queue.py new file mode 100644 index 0000000..333643d --- /dev/null +++ b/QUIS SISTER 1/1194005_Chapter02/Threading_with_queue.py @@ -0,0 +1,50 @@ +""""Thread synchronisation with queue""" + +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")