From a3879489b346bf11b0f94eae009c24f5dfa669fc Mon Sep 17 00:00:00 2001 From: ahmadfr20 Date: Wed, 20 Apr 2022 15:07:05 +0700 Subject: [PATCH] Quis Sister 1 Ahmad --- .../1194002_Ahmad Fathoni R_/Barrier.py | 49 ++++++++++++ .../1194002_Ahmad Fathoni R_/Condition.py | 73 ++++++++++++++++++ .../1194002_Ahmad Fathoni R_/Event.py | 47 ++++++++++++ .../MyThreadClass_lock.py | 74 ++++++++++++++++++ .../MyThreadClass_lock_2.py | 75 +++++++++++++++++++ .../1194002_Ahmad Fathoni R_/Rlock.py | 60 +++++++++++++++ .../1194002_Ahmad Fathoni R_/Semaphore.py | 41 ++++++++++ .../Thread_definition.py | 13 ++++ .../Thread_name_and_processes.py | 40 ++++++++++ .../Threading_with_queue.py | 53 +++++++++++++ 10 files changed, 525 insertions(+) create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Barrier.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Condition.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Event.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock_2.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Rlock.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Semaphore.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_definition.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_name_and_processes.py create mode 100644 QUIS SISTER 1/1194002_Ahmad Fathoni R_/Threading_with_queue.py diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Barrier.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Barrier.py new file mode 100644 index 0000000..4b1ea33 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Barrier.py @@ -0,0 +1,49 @@ +#%%barrier = 3 thread akan nge print dalam waktu yang beda, tapi pas wait->bakal print bareng +# barrier akan menunggu thread lain untuk beres execute + +from random import randrange +from threading import Barrier, Thread +from time import ctime, sleep + +num_sleepers = 3 +finish_line = Barrier(num_sleepers) +sleepers = ['Ahmad', 'Alwi', 'Abdul'] + +def sleeper(): + name = sleepers.pop() + sleep(randrange(1, 8)) + print('%s mulai tidur pada: %s ' % (name, ctime())) + finish_line.wait() + print('%s Bangun pada: %s ' % (name, ctime())) + +def main(): + threads = [] + print('Selamat Tidur') + for i in range(num_sleepers): + threads.append(Thread(target=sleeper)) + threads[-1].start() + for thread in threads: + thread.join() + print('Saatnya sahur') + +if __name__ == "__main__": + main() + +#%%barrier = 3 thread akan nge print dalam waktu yang beda, tapi pas wait->bakal print bareng +# barrier akan menunggu thread lain untuk beres execute + +# import time +# import random +# import threading + +# def f(b): +# time.sleep(random.randint(2, 10)) # +# print("{} execute ketika: {}".format(threading.current_thread().getName(), time.ctime())) +# b.wait() # akan wait thread lain untuk beres print +# print("{} keluar dari: {}".format(threading.current_thread().getName(), time.ctime())) + +# barrier = threading.Barrier(3) +# for i in range(3): +# t = threading.Thread(target=f, args=(barrier,)) +# t.start() +# %% \ No newline at end of file diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Condition.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Condition.py new file mode 100644 index 0000000..41918e2 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Condition.py @@ -0,0 +1,73 @@ +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() +# Variabel condition digunakan untuk memungkinkan satu atau lebih thread untuk menunggu hingga diberitahukan oleh thread lain. + + +class Pembeli(threading.Thread): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def beli(self): + + with condition: # membungkus / enkapsulasi proses dengan metode dari variabel condition. + + if len(items) == 0: + logging.info('Tidak ada makanan yang dapat dibeli') + condition.wait() + + items.pop() # menghapus 1 item pada index + logging.info('Kamu membeli 1 item makanan') + + condition.notify() # membangunkan thread yg menunggu variabel condition (jika ada) + # / memberi notif ke thread lain bahwa untuk sementara waktu proses disini sudah selesai + + def run(self): + for i in range(20): + time.sleep(2) # jeda waktu untuk membeli + self.beli() + + +class Penjual(threading.Thread): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def jual(self): + + with condition: # membungkus / enkapsulasi proses dengan metode dari variabel condition. + + if len(items) == 10: + logging.info('Di etalase terdapat {} item. Tidak cukup tempat. Produksi berhenti sementara'.format(len(items))) + condition.wait() # jika kondisinya sudah memenuhi tidak langsung berhenti, namun menunggu beberapa saat untuk proses thread lain + + items.append(1) # akan bertambah 1 setiap prosesnya + logging.info('Terdapat {} item makanan saat ini'.format(len(items))) # mengembalikan item yang dihapus + + condition.notify() # membangunkan thread yg menunggu variabel condition (jika ada) + # / memberi notif ke thread lain bahwa untuk sementara waktu proses disini sudah selesai + + def run(self): + for i in range(20): + time.sleep(0.5) # jeda waktu produksi + self.jual() + + +def main(): + pembeli = Penjual(name='Penjual') # (name) menginisialisasikan class Penjual dengan nama "penjual" agar dapat terbaca pada output + penjual = Pembeli(name='Pembeli') # (name) menginisialisasikan class Pembeli dengan nama "pembeli" agar dapat terbaca pada output + + penjual.start() + pembeli.start() + + penjual.join() + pembeli.join() + + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Event.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Event.py new file mode 100644 index 0000000..cb33289 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/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 Pelanggan(threading.Thread): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def run(self): + while True: + time.sleep(2) + event.wait() + item = items.pop() + logging.info('Pelanggan memberi tahu: {} saya mampir {}'\ + .format(item, self.name)) + +class Pedagang(threading.Thread): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def run(self): + for i in range(5): + time.sleep(2) + item = random.randint(0, 100) + items.append(item) + logging.info('Pedagang memberi tahu: barang {} dibuat oleh {}'\ + .format(item, self.name)) + event.set() + event.clear() + +if __name__ == "__main__": + t1 = Pedagang() + t2 = Pelanggan() + + t1.start() + t2.start() + + t1.join() + t2.join() diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock.py new file mode 100644 index 0000000..0d157b3 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock.py @@ -0,0 +1,74 @@ +import threading +import time +import os +from threading import Thread +from random import randint + +# Lock Definition +threadLock = threading.Lock() + +class AnggotaMhs (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 + \ + " Setiap orang Di kelas membawa bekal sebesar, "\ + + str(os.getpid()) + "\n") + time.sleep(self.duration) + print ("---> " + self.name + " over\n") + #Release the Lock + threadLock.release() + + +def main(): + start_time = time.time() + # Thread Creation + mahasiswa1 = AnggotaMhs("mahasiswa#1 ", randint(1,10)) + mahasiswa2 = AnggotaMhs("mahasiswa#2 ", randint(1,10)) + mahasiswa3 = AnggotaMhs("mahasiswa#3 ", randint(1,10)) + mahasiswa4 = AnggotaMhs("mahasiswa#4 ", randint(1,10)) + mahasiswa5 = AnggotaMhs("mahasiswa#5 ", randint(1,10)) + mahasiswa6 = AnggotaMhs("mahasiswa#6 ", randint(1,10)) + mahasiswa7 = AnggotaMhs("mahasiswa#7 ", randint(1,10)) + mahasiswa8 = AnggotaMhs("mahasiswa#8 ", randint(1,10)) + mahasiswa9 = AnggotaMhs("mahasiswa#9 ", randint(1,10)) + + # mahasiswa Running + mahasiswa1.start() + mahasiswa2.start() + mahasiswa3.start() + mahasiswa4.start() + mahasiswa5.start() + mahasiswa6.start() + mahasiswa7.start() + mahasiswa8.start() + mahasiswa9.start() + + # mahasiswa joining + mahasiswa1.join() + mahasiswa2.join() + mahasiswa3.join() + mahasiswa4.join() + mahasiswa5.join() + mahasiswa6.join() + mahasiswa7.join() + mahasiswa8.join() + mahasiswa9.join() + + # End + print("End") + + #Execution Time + print("--- %s seconds ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock_2.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock_2.py new file mode 100644 index 0000000..4c4938b --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/MyThreadClass_lock_2.py @@ -0,0 +1,75 @@ +import threading +import time +import os +from threading import Thread +from random import randint + +# Lock Definition +threadLock = threading.Lock() + +class AnggotaKelas (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 + \ + " Sedang Belajar, Dalam Kelas ini ada "\ + + str(os.getpid()) + "\n") + threadLock.release() + time.sleep(self.duration) + print ("---> " + self.name + " kelebihan\n") + #Release the Lock + + +def main(): + start_time = time.time() + + # Thread Creation + murid1 = AnggotaKelas("murid#1 ", randint(1,10)) + murid2 = AnggotaKelas("murid#2 ", randint(1,10)) + murid3 = AnggotaKelas("murid#3 ", randint(1,10)) + murid4 = AnggotaKelas("murid#4 ", randint(1,10)) + murid5 = AnggotaKelas("murid#5 ", randint(1,10)) + murid6 = AnggotaKelas("murid#6 ", randint(1,10)) + murid7 = AnggotaKelas("murid#7 ", randint(1,10)) + murid8 = AnggotaKelas("murid#8 ", randint(1,10)) + murid9 = AnggotaKelas("murid#9 ", randint(1,10)) + + # murid Running + murid1.start() + murid2.start() + murid3.start() + murid4.start() + murid5.start() + murid6.start() + murid7.start() + murid8.start() + murid9.start() + + # murid joining + murid1.join() + murid2.join() + murid3.join() + murid4.join() + murid5.join() + murid6.join() + murid7.join() + murid8.join() + murid9.join() + + # End + print("End") + + #Execution Time + print("--- %s seconds ---" % (time.time() - start_time)) + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Rlock.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Rlock.py new file mode 100644 index 0000000..661c75c --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Rlock.py @@ -0,0 +1,60 @@ +import threading +import time +import random + + +class Kemasan: + 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 penambah(Kemasan, items): + print("N° {} items to ADD \n".format(items)) + while items: + Kemasan.add() + time.sleep(1) + items -= 1 + print("menamnbahkan satu barang -->{} barang yang akan ditambahkan \n".format(items)) + + + +def pengurang(Kemasan, items): + print("N° {} barang yang akan dihapus \n".format(items)) + while items: + Kemasan.remove() + time.sleep(1) + items -= 1 + print("menghapus satu barang -->{} barang yang dihapus \n".format(items)) + + +def main(): + items = 10 + Kemasan = Kemasan() + + t1 = threading.Thread(target=penambah, \ + args=(Kemasan, random.randint(10,20))) + t2 = threading.Thread(target=pengurang, \ + args=(Kemasan, random.randint(1,10))) + + t1.start() + t2.start() + + + t1.join() + t2.join() + + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Semaphore.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Semaphore.py new file mode 100644 index 0000000..5a479b0 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/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) +item = 0 + + +def pelanggan(): + logging.info('Pesanan dibuat') + semaphore.acquire() + logging.info('Pelanggan memesan: menu nomor {}'.format(item)) + + +def kasir(): + global item + time.sleep(2) + item = random.randint(0, 1000) + logging.info('Kasir merespon: pesanan nomor {}'.format(item)) + semaphore.release() + + +def main(): + for i in range(10): + t1 = threading.Thread(target=pelanggan) + t2 = threading.Thread(target=kasir) + + t1.start() + t2.start() + + t1.join() + t2.join() + + +if __name__ == "__main__": + main() diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_definition.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_definition.py new file mode 100644 index 0000000..93f5e27 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_definition.py @@ -0,0 +1,13 @@ +#%% Thread definition = suatu proses yang dapat dijadwalkan untuk di execute +import time +from threading import Thread + +def ngaduk(i): + print ("proses ngaduk semen %d" % i) + time.sleep(2) + print ("ngaduk semen beres dalam %d" % i) + +for i in range(10): + t = Thread(target=ngaduk, args=(i,)) + t.start() +# %% diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_name_and_processes.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_name_and_processes.py new file mode 100644 index 0000000..9167752 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Thread_name_and_processes.py @@ -0,0 +1,40 @@ +from threading import Thread +import time +import os + +class ThreadSaya (Thread): + def __init__(self, name): + Thread.__init__(self) + self.name = name + + def run(self): + print("Proses yang sedang berjalan dengan ID {}".format(self.name)) #, " is {} \n".format(os.getpid())) + +def main(): + from random import randint + # pembuatan thread + proses1 = ThreadSaya("Thread ID 1 ") + proses2 = ThreadSaya("Thread ID 2 ") + proses3 = ThreadSaya("Thread ID 3 ") + + # memulai proses threading + proses1.start() + proses2.start() + proses3.start() + + + # Thread joining + proses1.join() + proses2.join() + proses3.join() + + # Selesai + print("Selesai") + + +if __name__ == "__main__": + main() + + + + diff --git a/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Threading_with_queue.py b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Threading_with_queue.py new file mode 100644 index 0000000..69c5e47 --- /dev/null +++ b/QUIS SISTER 1/1194002_Ahmad Fathoni R_/Threading_with_queue.py @@ -0,0 +1,53 @@ +""""Thread synchronisation with queue""" + +from threading import Thread +from queue import Queue +import time +import random + + +class pedagang(Thread): + + def __init__(self, queue): + Thread.__init__(self) + self.queue = queue + + def run(self): + for i in range(5): + item = random.randint(0, 256) + self.queue.put(item) + print('pedagang menambahkan : item N°%d melalui %s\n'\ + % (item, self.name)) + time.sleep(1) + + +class pelanggan(Thread): + + def __init__(self, queue): + Thread.__init__(self) + self.queue = queue + + def run(self): + while True: + item = self.queue.get() + print('pelanggan notify : %d popped from queue by %s'\ + % (item, self.name)) + self.queue.task_done() + +if __name__ == '__main__': + queue = Queue() + + t1 = pedagang(queue) + t2 = pelanggan(queue) + t3 = pelanggan(queue) + t4 = pelanggan(queue) + + t1.start() + t2.start() + t3.start() + t4.start() + + t1.join() + t2.join() + t3.join() + t4.join()