পাইথনে থ্রেড আইডি কীভাবে পাবেন


178

আমার কাছে একটি মাল্টি-থ্রেডিং পাইথন প্রোগ্রাম রয়েছে এবং একটি ইউটিলিটি ফাংশন রয়েছে writeLog(message)যা বার্তাটি অনুসরণ করে একটি টাইমস্ট্যাম্প লিখে। দুর্ভাগ্যক্রমে, ফলস্বরূপ লগ ফাইলটি কোন থ্রেডটি কোন বার্তাটি উত্পন্ন করছে তার কোনও ইঙ্গিত দেয় না।

writeLog()কোন থ্রেড এটি কল করছে তা সনাক্ত করতে আমি বার্তায় কিছু যুক্ত করতে সক্ষম হতে চাই । স্পষ্টতই আমি থ্রেডগুলি এই তথ্যটি পাস করতে পারি তবে এটি আরও অনেক বেশি কাজ হবে। os.getpid()আমি ব্যবহার করতে পারি তার সমতুল্য কিছু থ্রেড আছে ?

উত্তর:


226

threading.get_ident()কাজ করে, বা threading.current_thread().ident(বা threading.currentThread().identপাইথনের জন্য <2.6)।


3
আপনার লিঙ্ক নিকোলাস সংশোধন করেছে। আমি সম্প্রতি উপলব্ধি করেছি যে আপনি ডক্সে কোনও শিরোনাম ঘুরে দেখলে ডানদিকে একটু লাল প্রতীক উপস্থিত হয়। ডকসগুলিতে আরও নির্দিষ্ট লিঙ্কগুলির জন্য + অনুলিপি করুন :-)
জোন কেজ

2
মনে রাখবেন যে আপনি যদি threading.currentThread()জাইথন ব্যবহার করছেন তবে আপনি 2.5 সংস্করণ হিসাবে (উট কেস, উট_কেস নয়) চান ।
ক্যাম জ্যাকসন

3
@ চার্লসএন্ডারসন সাবধান হন, থ্রেড.নামে পাইথন ডক্সটি বলে "নাম - কেবল সনাক্তকরণের উদ্দেশ্যে ব্যবহৃত একটি স্ট্রিং। এটির কোনও শব্দার্থবিজ্ঞান নেই Multi একাধিক থ্রেড একই নাম দেওয়া যেতে পারে The প্রাথমিক নামটি কনস্ট্রাক্টর সেট করেছেন" "
drevicko

7
এছাড়াও নোট করুন যে কমপক্ষে পাইথন 2.5 এবং ওএস এক্স-তে 2.6-তে, এমন একটি বাগ রয়েছে threading.current_thread().identযা অনুপযুক্ত None। সম্ভবত ইন্দ্রিয় মাত্র ব্যবহার করে তোলে thread.get_ident()পাইথন 2 এবং threading.current_thread().identপাইথন 3
নিকোলাস রাইলি

5
আমার উত্তর পূর্ববর্তী সংস্করণে করেনি উল্লেখ thread.get_ident()( threading.get_ident()- ডকুমেন্টেশন লিঙ্ক অনুসরণ পাইথন 3.3 মধ্যে যোগ করা হয়েছিল)।
নিকোলাস রিলি

67

লগিং মডিউলটি ব্যবহার করে আপনি প্রতিটি লগ এন্ট্রিতে স্বয়ংক্রিয়ভাবে বর্তমান থ্রেড শনাক্তকারী যুক্ত করতে পারেন। কেবলমাত্র আপনার লগার ফর্ম্যাট স্ট্রিংয়ে এই লগেরকর্ড ম্যাপিং কীগুলি ব্যবহার করুন :

% (থ্রেড) d: থ্রেড আইডি (উপলভ্য থাকলে)।

% (থ্রেডনাম) গুলি: থ্রেডের নাম (যদি উপলভ্য থাকে)।

এবং এটির সাথে আপনার ডিফল্ট হ্যান্ডলারটি সেট আপ করুন:

logging.basicConfig(format="%(threadName)s:%(message)s")

আমি লগার ব্যবহার করছি সুতরাং আমি মনে করি আপনি উত্তরটি দেওয়া সহজ সমাধান। তবে আমি <concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2 এটি একটি থ্রেড নাম হিসাবে পেয়ে যাচ্ছি । এটি কি আমার থ্রেড নম্বর যা হ'ল
রবি শঙ্কর রেড্ডি

22

thread.get_ident()ফাংশন লিনাক্স একটি দীর্ঘ পূর্ণসংখ্যা ফেরৎ। এটি আসলে কোনও থ্রেড আইডি নয়।

আমি লিনাক্সে সত্যই থ্রেড আইডি পেতে এই পদ্ধতিটি ব্যবহার করি :

import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')

# System dependent, see e.g. /usr/include/x86_64-linux-gnu/asm/unistd_64.h
SYS_gettid = 186

def getThreadId():
   """Returns OS thread id - Specific to Linux"""
   return libc.syscall(SYS_gettid)

এটি কখনও কখনও ব্যবহৃত হতে পারে তবে বহনযোগ্য নয়
পিয়ুশ কানসাল

3
আপনি কি দয়া করে এই উত্তরটি সম্পাদনা করতে পারেন তাই লিঙ্কটি খারাপ হয়ে গেলে এটি দর্শকদের পক্ষে কার্যকর হতে পারে?
জোস্লিবার

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

অন্যরা যেমন ইঙ্গিত করেছে, দুর্ভাগ্যক্রমে এটি একটি এম্বেডড লিনাক্স 32 বিট আর্মে চলার মতো কিছুতে কাজ করে না।
ট্র্যাভিস গ্রিগস

@ ট্র্যাভিসগ্রিগস ধারণাটি লিনাক্সের কাছে পোর্টেবল, এতে 32 বিট এআরএম প্ল্যাটফর্ম রয়েছে। আপনার কেবল সঠিক সিস্টেম কল নম্বর পাওয়া দরকার যা সম্ভবত এআরএম এবং এআরএম 64 এ 224 হয়ে যাচ্ছে। এটি একটি ছোট সি প্রোগ্রামের সাথে বিল্ড বা রান সময় নির্ধারণ করা যেতে পারে। এটি আরপিআইতে পাইথন ৩.7 নিয়ে আমার জন্য কাজ করে। আপনার কাছে পাইথন ৩.৮ থাকলে জ্যাক টেসলারের উত্তরটি আরও ভাল, যা রাস্পবিয়ান 10 তে এখনও উপস্থিত নেই।
ট্রেন্টপি


7

আমি থ্রেড আইডির উদাহরণ দেখেছি:

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        self.threadID = threadID
        ...

থ্রেডিং মডিউল ডক্স তালিকা nameপাশাপাশি ATTRIBUTE:

...

A thread has a name. 
The name can be passed to the constructor, 
and read or changed through the name attribute.

...

Thread.name

A string used for identification purposes only. 
It has no semantics. Multiple threads may
be given the same name. The initial name is set by the constructor.

7

আপনি বর্তমান চলমান থ্রেডের পরিচয় পেতে পারেন। বর্তমান থ্রেডটি শেষ হলে পরিচয়টি অন্য থ্রেডের জন্য পুনরায় ব্যবহার করা যেতে পারে।

আপনি যখন থ্রেডের কোনও উদাহরণটি ক্রেট করেন, তখন একটি নাম থ্রেডকে অন্তর্ভুক্ত করা হয়, এটি হ'ল ধরণ: থ্রেড-সংখ্যা

নামের কোনও অর্থ নেই এবং নামটি অনন্য হতে হবে না। সমস্ত চলমান থ্রেডের পরিচয়টি অনন্য।

import threading


def worker():
    print(threading.current_thread().name)
    print(threading.get_ident())


threading.Thread(target=worker).start()
threading.Thread(target=worker, name='foo').start()

ফাংশন থ্রেডিং। বর্তমান_প্রেম () বর্তমান চলমান থ্রেডটি প্রদান করে। এই অবজেক্টটি থ্রেডের পুরো তথ্য ধারণ করে।


0

আমি পাইথনে একাধিক থ্রেড তৈরি করেছি, আমি থ্রেডের জিনিসগুলি মুদ্রণ করেছি এবং identভেরিয়েবলটি ব্যবহার করে আইডিটি মুদ্রণ করেছি । আমি দেখতে পাচ্ছি সমস্ত আইডিস এক রকম:

<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>

4
আমার ধারণা এটি পুনর্ব্যবহৃত হয়েছে, যেমনটি ডকস হিসাবে identবলেছেন: Thread identifiers may be recycled when a thread exits and another thread is created. docs.python.org/2/library/threading.html#threading.Thread.ident
oblalex

0

একইভাবে @ ব্রুসেক্সিনে আমার ওএস-স্তরের থ্রেড আইডেন্টিফায়ার (যা! = thread.get_ident()) পাওয়ার দরকার ছিল এবং নির্দিষ্ট সংখ্যার উপর নির্ভর না করে এবং কেবলমাত্র amd64- হওয়ার জন্য নীচের মতো কিছু ব্যবহার করতে হয়েছিল:

---- 8< ---- (xos.pyx)
"""module xos complements standard module os""" 

cdef extern from "<sys/syscall.h>":                                                             
    long syscall(long number, ...)                                                              
    const int SYS_gettid                                                                        

# gettid returns current OS thread identifier.                                                  
def gettid():                                                                                   
    return syscall(SYS_gettid)                                                                  

এবং

---- 8< ---- (test.py)
import pyximport; pyximport.install()
import xos

...

print 'my tid: %d' % xos.gettid()

এটি যদিও সাইথনের উপর নির্ভর করে।


আমি আশাবাদী এটি যে ক্রস প্ল্যাটফর্মের সংস্করণটি আমি সন্ধান করছিলাম এটি হবে তবে আমি কীওয়ার্ডের invalid syntaxপরে পয়েন্টার পেয়েছি on externআমি কি অনুপস্থিত কিছু আছে? কোডটি কোনও পৃথক মডিউলে থাকা এবং পাইক্স এক্সটেনশন থাকা গুরুত্বপূর্ণ? অথবা এটি একটি (পুনরায়) সংকলন জিনিস?
ট্র্যাভিস গ্রিগস

হ্যাঁ, এটি সাইথনের উপর নির্ভর করে এবং কোনও .pyxফাইলে থাকা উচিত । "খাঁটি পাইথন" এর জন্য সম্ভবত টাইপসের সাথেও একই রকম কিছু করা যেতে পারে।
কিরার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.