💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علی شهریاری
تموم نشدن اجرای کد
جامعه پایتون (وب) ایجاد شده در ۰۸ فروردین ۱۴۰۳

سلام

 من این تکه کدو نوشتم وقتی توی تابع tavan اون بخش time.sleep رو میرزارم درست کار میکنه ولی وقتی time.sleep رو حذف میکنم اجرای کد تموم نمیشه یعنی اصلا اون قسمت print('all finished') اصلا چاپ نمیشه مشکل چیه؟

 

import queue
import threading
import time
q = queue.Queue()
number_list = [234, 535, 3, 5, 345, 34, 533, 76] #* 10
def tavan(num):
    time.sleep(2)
    print(num ** 4)
class CustomThreading(threading.Thread):
    def __init__(self, queu, target, *args, **kwargs):
        self.queu = queu
        self.target = target
        super().__init__(*args, **kwargs)
    def run(self):
        while True:
            num = self.queu.get()
            self.target(num)
            self.queu.task_done()
            if self.queu.empty():
                break
if __name__ == '__main__':
    thread_llist = list()
    for i in number_list:
        q.put(i)
    for i in range(3):
        c = CustomThreading(queu=q, target=tavan)
        thread_llist.append(c)
        c.start()
    for i in thread_llist:
        i.join()
    print('all finished')

سلام وقت بخیر 
من کد رو بررسی کردم و مشکلی نداشت اما
توی کدی که ارسال کردین، شما از چندین tread برای اجرای توابع `tavan` با استفاده از کلاس `CustomThreading` استفاده کردین. مشکلی که احتمالاً باعث عدم اجرای تمامی کد شما میشه، اینه که قبل از چاپ "all finished" ممکن است تمامی tread‌ها تموم نشن و بنابراین برنامه به پایان نرسه.

شما از `queue` برای این کار استفاده کردین، اما در بخشی از کد شما کارها را تمام می‌کنید ولی پیام "all finished" را قبل از اینکه همه کارها به پایان برسند چاپ می‌کنید.

برای حل این مشکل، بهتره تا قبل از چاپ پیام "all finished" منتظر اتمام تمامی tread‌ها باشین. میتونید از `queu.join()` بعد از حلقه `for` استفاده کنین که صبر کنه تا تمامی کارها به تموم بشه.


import queue
import threading
import time
q = queue.Queue()
number_list = [234, 535, 3, 5, 345, 34, 533, 76] #* 10
def tavan(num):
   time.sleep(2)
   print(num ** 4)
class CustomThreading(threading.Thread):
   def __init__(self, queu, target, *args, **kwargs):
       self.queu = queu
       self.target = target
       super().__init__(*args, **kwargs)
   def run(self):
       while True:
           num = self.queu.get()
           self.target(num)
           self.queu.task_done()
           if self.queu.empty():
               break
if __name__ == '__main__':
   thread_llist = list()
   for i in number_list:
       q.put(i)
   for i in range(3):
       c = CustomThreading(queu=q, target=tavan)
       thread_llist.append(c)
       c.start()
   for i in thread_llist:
       i.join()
   q.join()  # Wait for all tasks to be done
   print('all finished')

این تغییرات مطمعن میشه که پیام "all finished" تنها زمانی چاپ بشه که همه tread‌ها کارشون تموم شده.


موفق باشید 💎

Reza Mobaraki ۰۸ فروردین ۱۴۰۳، ۰۸:۵۵

این کار رو هم کردم بازم همون مشکل بود و قسمت جالبش اینه که وقتی تعداد اعضای number_list ضرب یک عدد بزرگ کردم مشکل حل شد فک کنم چون خیلی عملیات وقت گیری نبود ترد اول قبل از اینکه سایر ترد‌ها ساخته بشن کار رو تموم میکرد و وقتی ترد دوم میرسید تو حلقه گیر میکرد

علی شهریاری ۰۸ فروردین ۱۴۰۳، ۱۲:۱۱

مباحث مربوط به multi treading, multi proccessing, concurency گاهی اوقات نتیجه متفاوت در سیستم‌های متفاوت دارن.
مثلا هر دو مورد روی سیستم من اوکی هست .

Reza Mobaraki ۱۰ فروردین ۱۴۰۳، ۱۷:۴۵