سؤال

لدي برنامج Python متعدد الخيوط، وظيفة فائدة، writeLog(message), ، يكتب هذا الطابع الزمني تليها الرسالة. لسوء الحظ، لا يعطي ملف السجل الناتج أي إشارة إلى مؤشر ترابط يولد الرسالة.

أود writeLog() لتكون قادرا على إضافة شيء إلى الرسالة لتحديد الخيط الذي يدعيه. من الواضح أنني يمكن أن تجعل الخيوط تمر هذه المعلومات، ولكن هذا سيكون أكثر عمل أكبر. هل هناك بعض الخيط ما يعادل os.getpid() أن استطيع استخدامها؟

هل كانت مفيدة؟

المحلول

threading.get_ident() يعمل، أو threading.current_thread().ident (أو threading.currentThread().ident لبثون <2.6).

نصائح أخرى

باستخدام تسجيل وحدة يمكنك إضافة معرف الترابط الحالي تلقائيا في كل إدخال سجل. فقط استخدم واحدة من هذه Logrecord. مفاتيح تعيين في سلسلة تنسيق المسجل الخاص بك:

٪ (موضوع) D: معرف الخيط (إن وجد).

٪ (NEALNAME) S: اسم الموضوع (إن وجدت).

وإعداد المعالج الافتراضي الخاص بك معها:

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

ال thread.get_ident() تقوم الدالة بإرجاع عدد صحيح طويل على Linux. انها ليست معرف موضوع حقا.

أنا أستعمل هذه الطريقة للحصول على معرف مؤشر الترابط في Linux:

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)

رأيت أمثلة من معرفات الخيط مثل هذا:

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

ال خيوط مستندات وحدة قوائم name السمة كذلك:

...

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.

يمكنك الحصول على تحديد مؤشر ترابط التشغيل الحالي. يمكن إعادة استخدام الحالة من أجل مواضيع أخرى، إذا انتهت الخيط الحالي.

عند قفص مثيل للخيط، يتم إعطاء اسم ضمني إلى مؤشر الترابط، وهو النموذج: رقم الخيط

الاسم ليس له معنى ولا يجب أن يكون الاسم فريدا. تعد وجود جميع خيوط التشغيل فريدة من نوعها.

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()

تقوم وظيفة Threading.current_thread () بإرجاع مؤشر ترابط التشغيل الحالي. هذا الكائن يحمل المعلومات بأكملها من الموضوع.

لقد أنشأت مؤشرات ترابط متعددة في بيثون، لقد قمت بطباعة كائنات الخيط، وطبعت المعرف باستخدام ident عامل. أرى كل المعرفات هي نفسها:

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

وبالمثل RuceSxin أحتاج إلى الحصول على معرف مؤشر ترابط OS-Level (الذي! = 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()

هذا يعتمد على سيليثون رغم ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top