পাইথন থ্রেডিংয়ে যোগ () ব্যবহার কী?


197

আমি অজগর থ্রেডিং অধ্যয়নরত ছিল এবং জুড়ে এসেছিলাম join()

লেখক বলেছিলেন যে থ্রেড যদি ডেমন মোডে থাকে তবে আমার ব্যবহার করা দরকার join()যাতে মূল থ্রেড শেষ হওয়ার আগে থ্রেডটি নিজেই শেষ করতে পারে।

তবে আমি তাকে ব্যবহার t.join()করতেও দেখেছি যদিও তা tছিল নাdaemon

উদাহরণ কোড এটি

import threading
import time
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-10s) %(message)s',
                    )

def daemon():
    logging.debug('Starting')
    time.sleep(2)
    logging.debug('Exiting')

d = threading.Thread(name='daemon', target=daemon)
d.setDaemon(True)

def non_daemon():
    logging.debug('Starting')
    logging.debug('Exiting')

t = threading.Thread(name='non-daemon', target=non_daemon)

d.start()
t.start()

d.join()
t.join()

t.join()ডেমন হিসাবে এটি কীভাবে ব্যবহার করছে তা আমি জানি না এবং আমি এটি সরিয়ে দিলেও কোনও পরিবর্তন দেখতে পাচ্ছি না


13
শিরোনামের জন্য +1। 'যোগ দিন' বিশেষত দুর্বল কর্মক্ষমতা, (ক্রমাগত থ্রেড তৈরি / সমাপ্ত / ধ্বংস করে), জিইউআই লকআপস, (ইভেন্ট হ্যান্ডলারের অপেক্ষায়) এবং অ্যাপ্লিকেশন শাটডাউন ব্যর্থতা, (নিরবচ্ছিন্ন থ্রেডগুলি সমাপ্তির অপেক্ষায়) উত্সাহিত করার জন্য বিশেষভাবে ডিজাইন করা হয়েছে বলে মনে হয়। দ্রষ্টব্য - কেবল পাইথন নয়, এটি একটি ক্রস-ভাষা বিরোধী নিদর্শন।
মার্টিন জেমস

উত্তর:


287

মেকানিজম দেখানোর জন্য কিছুটা আনাড়ি অসি-আর্ট: join()সম্ভবত মূল থ্রেড দ্বারা ডাকা হয়। এটি অন্য থ্রেড দ্বারাও ডাকা যেতে পারে তবে অকারণে চিত্রটি জটিল করে তুলবে।

joinকলিংটি মূল-থ্রেডের ট্র্যাকের মধ্যে রাখা উচিত, তবে থ্রেড-সম্পর্ক প্রকাশ এবং এটি যথাসম্ভব সহজ রাখার জন্য, আমি এটি পরিবর্তে চাইল্ড-থ্রেডে রাখার পছন্দ করি।

without join:
+---+---+------------------                     main-thread
    |   |
    |   +...........                            child-thread(short)
    +..................................         child-thread(long)

with join
+---+---+------------------***********+###      main-thread
    |   |                             |
    |   +...........join()            |         child-thread(short)
    +......................join()......         child-thread(long)

with join and daemon thread
+-+--+---+------------------***********+###     parent-thread
  |  |   |                             |
  |  |   +...........join()            |        child-thread(short)
  |  +......................join()......        child-thread(long)
  +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,     child-thread(long + daemonized)

'-' main-thread/parent-thread/main-program execution
'.' child-thread execution
'#' optional parent-thread execution after join()-blocked parent-thread could 
    continue
'*' main-thread 'sleeping' in join-method, waiting for child-thread to finish
',' daemonized thread - 'ignores' lifetime of other threads;
    terminates when main-programs exits; is normally meant for 
    join-independent tasks

সুতরাং আপনি কোনও পরিবর্তন না দেখার কারণ হ'ল আপনার মূল থ্রেডটি আপনার পরে কিছুই করে না join। আপনি বলতে পারেন join(কেবল) মূল-থ্রেডের সম্পাদন-প্রবাহের জন্য প্রাসঙ্গিক।

উদাহরণস্বরূপ, যদি আপনি একত্রে বৃহত পৃষ্ঠায় একত্রে পৃষ্ঠাগুলি একত্রে ডাউনলোড করতে চান তবে আপনি থ্রেড ব্যবহার করে একযোগে ডাউনলোডগুলি শুরু করতে পারেন তবে আপনি কোনও পৃষ্ঠা একত্রিত করা শুরু করার আগে শেষ পৃষ্ঠা / থ্রেডটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে অনেকের বাইরে আপনি যখন এটি ব্যবহার করেন join()


দয়া করে নিশ্চিত করুন যে প্রোগ্রামটি কার্যকর করা অবরুদ্ধ না করে একটি ডিমনাইজড থ্রেড যুক্ত হতে পারে ()?
Aviator45003

@ Aviator45003: হ্যাঁ, মত সময়সীমার যুক্তি ব্যবহার করে: demon_thread.join(0.0), join()ডিফল্ট daemonized অ্যাট্রিবিউট ব্যাপারে ছাড়া ব্লক করা। তবে একটি অশুভ থ্রেডে যোগ দেওয়া সম্ভবত সমস্যার পুরোটা খুলে দিতে পারে! আমি এখন join()ডেমন-থ্রেডের জন্য আমার ছোট চিত্রটিতে কলটি সরিয়ে নেওয়ার চিন্তা করছি ...
ডন প্রশ্ন

@DonQuestion তাই আপনি যদি আমরা সেট daemon=Trueআমরা প্রয়োজন হবে না join()আমাদের প্রয়োজন যদি join()কোডের শেষে?
বেনিয়ামিন জাফারি 22'19

@ বেনিয়ামিন জাফারি: হ্যাঁ। যদি না হয়, তবে মূল-থ্রেড (= প্রোগ্রাম) প্রস্থান করবে, যদি কেবল ডেমন-থ্রেডটি অবশিষ্ট থাকে। তবে একটি (পাইথন) ডেমন থ্রেডের প্রকৃতি হ'ল এই ব্যাকগ্রাউন্ড টাস্কটি এখনও চলমান থাকলে মূল থ্রেড যত্ন করে না। আমি আমার উত্তরে কীভাবে এটি বিশদভাবে জানাতে হবে, সেই বিষয়টি পরিষ্কার করার জন্যই আমি চিন্তা করব। আপনার মন্তব্যের জন্য ধন্যবাদ!
ডন প্রশ্ন

প্রথম ক্ষেত্রে, main threadশেষ হয়ে গেলে , প্রোগ্রামটি child-thread(long)নিজেই চালানো ছাড়াই শেষ করবে (অর্থাত্ child-thread(long)সম্পূর্ণভাবে সম্পন্ন হয় না)?
স্কাইটি ট্রি

65

ডক্স থেকে সরাসরি

যোগ দিন ([সময়সীমা]) থ্রেডটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন। যার সাথে যুক্ত হওয়া থ্রেডকে সমাপ্তি বলা হয় ততক্ষণ এই কলিং থ্রেডকে অবরুদ্ধ করে - হয় সাধারণত বা অবিচ্ছিন্ন ব্যতিক্রমের মাধ্যমে - বা alচ্ছিক সময়সীমা না আসা পর্যন্ত।

এর অর্থ হ'ল মূল থ্রেড যা ফুটে ওঠে tএবং শেষ না হওয়া পর্যন্ত এটি শেষ হওয়ার dজন্য অপেক্ষা tকরে।

আপনার প্রোগ্রামটি যুক্তিযুক্ত উপর নির্ভর করে আপনার মূল থ্রেডটি চালিয়ে যাওয়ার আগে আপনি কোনও থ্রেড শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চাইতে পারেন।

ডক্স থেকেও:

একটি থ্রেডকে "ডেমন থ্রেড" হিসাবে পতাকাঙ্কিত করা যেতে পারে। এই পতাকার তাত্পর্যটি হ'ল ডেমনের থ্রেডগুলি কেবল তখনই ছেড়ে যায় যখন পুরো পাইথন প্রোগ্রামটি উপস্থিত হয়।

একটি সহজ উদাহরণ, বলুন আমাদের এটি আছে:

def non_daemon():
    time.sleep(5)
    print 'Test non-daemon'

t = threading.Thread(name='non-daemon', target=non_daemon)

t.start()

যা দিয়ে শেষ:

print 'Test one'
t.join()
print 'Test two'

এটি আউটপুট দেবে:

Test one
Test non-daemon
Test two

এখানে মাস্টার থ্রেড স্পষ্টভাবে দ্বিতীয় বার tকল printনা হওয়া পর্যন্ত থ্রেডটি শেষ হওয়ার জন্য অপেক্ষা করছে ।

বিকল্পভাবে আমাদের যদি এটি থাকে:

print 'Test one'
print 'Test two'
t.join()

আমরা এই আউটপুট পাবেন:

Test one
Test two
Test non-daemon

এখানে আমরা মূল থ্রেডে আমাদের কাজটি করি এবং তারপরে আমরা tথ্রেডটি শেষ হওয়ার জন্য অপেক্ষা করি । এই ক্ষেত্রে আমরা এমনকি স্পষ্ট যোগদান যোগদান সরিয়ে ফেলতে পারি t.join()এবং প্রোগ্রামটি সম্পূর্ণরূপে tশেষ হওয়ার জন্য অপেক্ষা করবে for


আপনি কি আমার কোডটিতে কিছু ছানা তৈরি করতে পারেন যাতে আমি এর পার্থক্যটি দেখতে পারি t.join()। মনমরা ঘুম বা অন্য কিছু যুক্ত করে। এই মুহুর্তে আমি প্রোগ্রামটি ব্যবহার করি বা না করি তবুও কোনও ছাগল দেখতে পাই। কিন্তু ড্যামনের জন্য আমি তার প্রস্থানটি দেখতে পাচ্ছি যদি আমি ব্যবহার করি d.join()যা আমি দেখতে পাই না যখন আমি d.join () ব্যবহার করি না
user192362127

34

এই থ্রেডের জন্য ধন্যবাদ - এটি আমাকে অনেক সাহায্য করেছে।

আমি আজই জয়ন () সম্পর্কে কিছু শিখলাম।

এই থ্রেডগুলি সমান্তরালভাবে চলে:

d.start()
t.start()
d.join()
t.join()

এবং এগুলি ধারাবাহিকভাবে চালিত হয় (যা আমি চাই তা নয়):

d.start()
d.join()
t.start()
t.join()

বিশেষত, আমি চালাক এবং পরিপাটি করার চেষ্টা করছিলাম:

class Kiki(threading.Thread):
    def __init__(self, time):
        super(Kiki, self).__init__()
        self.time = time
        self.start()
        self.join()

এইটা কাজ করে! তবে এটি ধারাবাহিকভাবে চলে। আমি সেল্ফ স্টার্ট () কে __ init __ এ রাখতে পারি তবে স্ব.জয়েন () না। প্রতিটি থ্রেড শুরু হওয়ার পরে এটি করা উচিত ।

যোগ দিন () যা মূল থ্রেডটি আপনার থ্রেডটি শেষ হওয়ার জন্য অপেক্ষা করে। অন্যথায়, আপনার থ্রেডটি নিজেই চালিত হয়।

সুতরাং মূল থ্রেডটিতে "হোল্ড" হিসাবে যোগদানের () যোগসূত্র ভাবার এক উপায় - এটি আপনার থ্রেডকে ধরণের করে এবং মূল থ্রেডটি ক্রমাগতভাবে চালিত করে, মূল থ্রেডটি চালিয়ে যাওয়ার আগে। এটি আশ্বাস দেয় যে মূল থ্রেড এগিয়ে যাওয়ার আগে আপনার থ্রেডটি সম্পূর্ণ is মনে রাখবেন এর অর্থ এটি ঠিক আছে যদি আপনি জোড় () কল করার আগে আপনার থ্রেডটি ইতিমধ্যে শেষ হয়ে যায় - জয়েন () বলা হওয়ার পরে মূল থ্রেডটি তত্ক্ষণাত্ প্রকাশ করা হয়।

আসলে, এটি এখনই আমার কাছে ঘটেছিল যে মূল থ্রেডটি d.join () এ অপেক্ষা করে থাকে যতক্ষণ না থ্রেড ডি শেষ হয় এটি t.join () এ যাওয়ার আগেই শেষ হয়।

আসলে, খুব পরিষ্কার হতে, এই কোডটি বিবেচনা করুন:

import threading
import time

class Kiki(threading.Thread):
    def __init__(self, time):
        super(Kiki, self).__init__()
        self.time = time
        self.start()

    def run(self):
        print self.time, " seconds start!"
        for i in range(0,self.time):
            time.sleep(1)
            print "1 sec of ", self.time
        print self.time, " seconds finished!"


t1 = Kiki(3)
t2 = Kiki(2)
t3 = Kiki(1)
t1.join()
print "t1.join() finished"
t2.join()
print "t2.join() finished"
t3.join()
print "t3.join() finished"

এটি এই আউটপুট উত্পাদন করে (মুদ্রণ বিবৃতি একে অপরের মধ্যে থ্রেড করা হয় তা নোট করুন।)

$ python test_thread.py
32   seconds start! seconds start!1

 seconds start!
1 sec of  1
 1 sec of 1  seconds finished!
 21 sec of
3
1 sec of  3
1 sec of  2
2  seconds finished!
1 sec of  3
3  seconds finished!
t1.join() finished
t2.join() finished
t3.join() finished
$ 

T1.join () মূল থ্রেড ধরে রেখেছে। T1.join () শেষ হওয়ার আগেই তিনটি থ্রেড সম্পূর্ণ হয় এবং মূল থ্রেড প্রিন্টটি চালিত করতে চালিত হয় তারপরে t2.join () তারপরে মুদ্রণ করুন t3.join () তারপরে মুদ্রণ করুন।

সংশোধন স্বাগত। আমি থ্রেডিংয়েও নতুন।

(দ্রষ্টব্য: আপনি যদি আগ্রহী হন তবে আমি একটি ড্রিংকবটের জন্য কোড লিখছি, এবং উপাদান পাম্পগুলি ক্রমান্বয়ে পরিবর্তে একযোগে চালানোর জন্য আমার থ্রেডিং দরকার - প্রতিটি পানীয়ের জন্য অপেক্ষা করার জন্য কম সময়)))


আরে, আমি পাইথন থ্রেডিংয়ের ক্ষেত্রেও নতুন এবং মূল থ্রেড সম্পর্কে বিভ্রান্ত, প্রথম থ্রেডটি কি মূল থ্রেড, যদি না হয় তবে দয়া করে আমাকে গাইড করুন?
রোহিত খাত্রি

মূল থ্রেডটি নিজেই প্রোগ্রাম। প্রতিটি থ্রেড সেখান থেকে কাঁটাচামচ করা হয়। এরপরে তারা আবার যোগ হয়ে যায় - কারণ কমান্ড জয়েনড () এ প্রোগ্রামটি চালানো চালিয়ে যাওয়ার আগে থ্রেডটি শেষ না হওয়া পর্যন্ত অপেক্ষা করে।
কিকি জয়েল

15

পদ্ধতি যোগদান ()

যার থ্রেড () পদ্ধতিতে কল করা থ্রেডটি বন্ধ না হওয়া অবধি কলিং থ্রেডকে অবরুদ্ধ করে।

সূত্র: http://docs.python.org/2/library/threading.html


14
সুতরাং যোগদান ব্যবহার কি? ও.পি. প্রশ্নটি দেখুন, কেবলমাত্র দস্তাবেজগুলিকে প্যারাফ্রেস করবেন না
ডন প্রশ্ন

@ ডোনকুইশন আমি এমনকি ডেমন থ্রেডে ব্যবহার না করে ঘুম.টিমার (২০) যুক্ত করার চেষ্টা করেছি t.join()এবং প্রোগ্রামটি এখনও সমাপ্তির আগে অপেক্ষা করে। আমি t.join()আমার কোডে এখানে কোনও ব্যবহার দেখতে পাচ্ছি না
ব্যবহারকারী 192362127

আরও ব্যাখ্যা জন্য আমার উত্তর দেখুন। নন-রাক্ষুসে আপনার ঘুম সম্পর্কে ।
ডন প্রশ্ন

2
'যোগ' এবং 'ব্লক' পরিভাষাটি বিস্ময়কর। 'অবরুদ্ধ' সুপারিশ করে কলিং প্রক্রিয়াটি এখনও করা অনেকগুলি কাজ করা থেকে 'অবরুদ্ধ' করা হয়েছে, যদিও বাস্তবে এটি কেবল বন্ধ করতে (ওএসে ফিরে আসা) আটকানো হয়েছে, আরও কিছু নয়। একই টোকেন দ্বারা, এটি এতটা স্পষ্ট নয় যে একটি মূল থ্রেড চাইল্ড থ্রেডকে এটি 'যোগদান' করার জন্য ডেকেছে (অর্থাত্ শেষ করা)। সুতরাং, ডন কিউ, ব্যাখ্যাটির জন্য ধন্যবাদ।
রল্ফব্লি

4

সাধারণ বোঝা,

যোগদানের সাথে - অনুবাদক পর্যন্ত আপনার প্রক্রিয়া পেতে অপেক্ষা করবে সম্পন্ন বা সমাপ্ত

>>> from threading import Thread
>>> import time
>>> def sam():
...   print 'started'
...   time.sleep(10)
...   print 'waiting for 10sec'
... 
>>> t = Thread(target=sam)
>>> t.start()
started

>>> t.join() # with join interpreter will wait until your process get completed or terminated
done?   # this line printed after thread execution stopped i.e after 10sec
waiting for 10sec
>>> done?

যোগদান ছাড়াই - দোভাষী তার প্রক্রিয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করবেন না ,

>>> t = Thread(target=sam)
>>> t.start()
started
>>> print 'yes done' #without join interpreter wont wait until process get terminated
yes done
>>> waiting for 10sec

1

join(t)নন-ডেমন থ্রেড এবং ডেমন থ্রেড উভয়ের জন্য ফাংশন তৈরি করার সময় , মূল থ্রেড (বা প্রধান প্রক্রিয়া) tকয়েক সেকেন্ড অপেক্ষা করা উচিত , তারপরে নিজের প্রক্রিয়াটিতে কাজ করতে আরও এগিয়ে যেতে পারে। সময় tসময় অপেক্ষা সেকেন্ড, শিশু দুটি থ্রেড কি তারা এমন কিছু টেক্সট আউট মুদ্রণ হিসাবে, কি করতে পারেন করা উচিত। tসেকেন্ড পরে , যদি নন-ডেমন থ্রেড এখনও তার কাজ শেষ না করে এবং মূল প্রক্রিয়াটি কাজ শেষ করার পরে এটি এখনও এটি শেষ করতে পারে তবে ডেমন থ্রেডের জন্য, এটি কেবল তার সুযোগের উইন্ডোটি মিস করে missed যাইহোক, অজগর প্রোগ্রামটি প্রস্থান করার পরে এটি শেষ পর্যন্ত মারা যাবে। কিছু ভুল থাকলে দয়া করে আমাকে সংশোধন করুন।


1

পাইথনে ৩.x যোগে () মূল থ্রেডের সাথে একটি থ্রেডে যোগ দিতে ব্যবহৃত হয় (যখন যোগ করা হয়) যখন কোনও নির্দিষ্ট থ্রেডের জন্য ব্যবহৃত হয় তখন যোগ থ্রেডের সম্পাদনা শেষ না হওয়া পর্যন্ত মূল থ্রেড কার্যকর করা বন্ধ করে দেয়।

#1 - Without Join():
import threading
import time
def loiter():
    print('You are loitering!')
    time.sleep(5)
    print('You are not loitering anymore!')

t1 = threading.Thread(target = loiter)
t1.start()
print('Hey, I do not want to loiter!')
'''
Output without join()--> 
You are loitering!
Hey, I do not want to loiter!
You are not loitering anymore! #After 5 seconds --> This statement will be printed

'''
#2 - With Join():
import threading
import time
def loiter():
    print('You are loitering!')
    time.sleep(5)
    print('You are not loitering anymore!')

t1 = threading.Thread(target = loiter)
t1.start()
t1.join()
print('Hey, I do not want to loiter!')

'''
Output with join() -->
You are loitering!
You are not loitering anymore! #After 5 seconds --> This statement will be printed
Hey, I do not want to loiter! 

'''

0

এই উদাহরণটি .join()ক্রিয়াটি দেখায় :

import threading
import time

def threaded_worker():
    for r in range(10):
        print('Other: ', r)
        time.sleep(2)

thread_ = threading.Timer(1, threaded_worker)
thread_.daemon = True  # If the main thread kills, this thread will be killed too. 
thread_.start()

flag = True

for i in range(10):
    print('Main: ', i)
    time.sleep(2)
    if flag and i > 4:
        print(
            '''
            Threaded_worker() joined to the main thread. 
            Now we have a sequential behavior instead of concurrency.
            ''')
        thread_.join()
        flag = False

বাইরে:

Main:  0
Other:  0
Main:  1
Other:  1
Main:  2
Other:  2
Main:  3
Other:  3
Main:  4
Other:  4
Main:  5
Other:  5

            Threaded_worker() joined to the main thread. 
            Now we have a sequential behavior instead of concurrency.

Other:  6
Other:  7
Other:  8
Other:  9
Main:  6
Main:  7
Main:  8
Main:  9

0

মূল থ্রেডের (বা অন্য কোনও থ্রেড) অন্যান্য থ্রেডে যোগ দেওয়ার কয়েকটি কারণ রয়েছে

  1. কোনও থ্রেড কিছু সংস্থান তৈরি বা লকড (লক করা) থাকতে পারে। যোগদান-কলিং থ্রেড তার পক্ষে সংস্থানগুলি সাফ করতে সক্ষম হতে পারে

  2. যোগদান () হ'ল জোড়-কলিং থ্রেডের জন্য থ্রেড বন্ধ হয়ে যাওয়ার পরে অব্যাহত রাখার জন্য এটি একটি প্রাকৃতিক ব্লকিং কল।

যদি পাইথন প্রোগ্রামটি অন্য থ্রেডগুলিতে যোগদান না করে তবে পাইথন ইন্টারপ্রেটারটি তার পক্ষে নন-ডেমন থ্রেডগুলিতে যোগদান করবে।


-2

"যোগদান () ব্যবহার করে কী ব্যবহার করবেন?" তুমি বলো. সত্যিই, এটি "ফাইলগুলি বন্ধ করার কীভাবে ব্যবহার করা যায় তার মতোই উত্তর, যেহেতু অজগর এবং ওএস আমার প্রোগ্রামটি বন্ধ হয়ে গেলে আমার জন্য আমার ফাইলটি বন্ধ করে দেবে?"

এটি কেবল ভাল প্রোগ্রামিংয়ের বিষয়। আপনি কোডে পয়েন্ট যে থ্রেড উচিত আপনার থ্রেড যোগদান করা উচিত () না এখন আর চলমান হতে, হয় কারণ আপনার ইতিবাচক নিশ্চিত করার থ্রেড আপনার নিজের কোড হস্তক্ষেপ চলছে না থাকে, অথবা আপনি একটি সঠিকভাবে আচরণ করতে চান বৃহত্তর সিস্টেম।

যোগ দিতে () যোগ দিতে পারে এমন অতিরিক্ত সময়ের কারণে আপনি বলতে পারেন যে "আমি আমার কোড উত্তর দিতে দেরি করব না" because এটি কিছু পরিস্থিতিতে পুরোপুরি বৈধ হতে পারে তবে আপনার কোডটি এখন "পাইথন এবং ওএস পরিষ্কারের জন্য ক্রুফট ছেড়ে চলেছে" তা আপনার অ্যাকাউন্টে নেওয়া উচিত। আপনি যদি পারফরম্যান্সের কারণে এটি করেন তবে আমি দৃ strongly়ভাবে আপনাকে সেই আচরণের দলিল করতে উত্সাহিত করব। এটি বিশেষত সত্য যদি আপনি কোনও লাইব্রেরি / প্যাকেজ তৈরি করে থাকেন যা অন্যরা ব্যবহার করে বলে আশা করা হয়।

কোন কারণ না যোগদানের (), কর্মক্ষমতা কারণে ছাড়া অন্য, এবং আমি তর্ক করবে আপনার কোড সঞ্চালন করার দরকার নেই যে ভাল।


6
থ্রেড পরিষ্কার করার বিষয়ে আপনি যা বলেন তা সত্য নয়। থ্রেডিংয়ের উত্স কোডটি একবার দেখুন h থ্রেড.জয়াইন ()। সমস্ত ফাংশনটি হ'ল একটি লকটিতে অপেক্ষা করা, এবং তারপরে ফিরে আসা। কিছুই আসলে পরিষ্কার করা হয় না।
কলিন

1
@ কলিন - থ্রেড নিজেই সংস্থান থাকতে পারে, সেই ক্ষেত্রে দোভাষী এবং ওএসকে অবশ্যই "ক্রাফট" পরিষ্কার করতে হবে।
qneill

1
আবার, থ্রেডিংয়ের উত্স কোডটি দেখুন h থ্রেড.জাইন ()। সম্পদের সংগ্রহকে ট্রিগার করে এমন কিছুই নেই।
কলিন 16

এটি অগত্যা নয় (এবং আপনি যেমন বলছেন ঠিক তেমন নয়) থ্রেডিং মডিউল যা সংস্থানগুলি ধারণ করে, তবে থ্রেডটি নিজেই। যোগদান () ব্যবহারের অর্থ আপনি থ্রেডটি যা করতে চায় তা শেষ করার জন্য অপেক্ষা করছেন, যার মধ্যে সম্পদ বরাদ্দ করা এবং ছেড়ে দেওয়া অন্তর্ভুক্ত থাকতে পারে।
ক্রিস কগডন

2
থ্রেডের দ্বারা পরিচালিত সংস্থানগুলি প্রকাশিত হওয়ার পরে আপনি অপেক্ষা করুন বা না প্রভাবিত করুন কিনা। আপনি কেন কলিংয়ের সাথে এটি বেঁধে রাখছেন তা আমি নিশ্চিত নই join()
কলিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.