229

マルチスレッドのPythonプログラムと、writeLog(message)タイムスタンプの後にメッセージを書き出すユーティリティ関数があります。残念ながら、結果のログファイルには、どのスレッドがどのメッセージを生成しているかが示されません。

writeLog()メッセージに何かを追加して、どのスレッドがメッセージを呼び出しているかを識別できるようにしたいと思います。明らかに、スレッドにこの情報を渡すようにすることもできますが、それはもっと多くの作業になります。私が使用できるものと同等のスレッドはありos.getpid()ますか?

4

8 に答える 8

304

threading.get_ident()動作します、またはthreading.current_thread().ident(またはthreading.currentThread().identPython <2.6の場合)。

于 2009-05-28T09:13:40.153 に答える
80

ロギングモジュールを使用すると、各ログエントリに現在のスレッド識別子を自動的に追加できます。ロガーフォーマット文字列で次のLogRecordマッピングキーの1つを使用するだけです。

%(thread)d: スレッドID(使用可能な場合)。

%(threadName)s: スレッド名(使用可能な場合)。

それを使用してデフォルトのハンドラーを設定します。

logging.basicConfig(format="%(threadName)s:%(message)s")
于 2010-03-01T17:19:18.040 に答える
28

このthread.get_ident()関数は、Linuxでは長整数を返します。実際にはスレッドIDではありません。

私はこのメソッドを使用して、Linuxで実際にスレッドIDを取得します。

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)
于 2012-02-23T09:17:44.650 に答える
20

この機能はPython3.8+でサポートされるようになりました:)

これで、次を使用できます。threading.get_native_id()

https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0

https://github.com/python/cpython/pull/11993

于 2019-05-12T17:26:24.803 に答える
15

現在実行中のスレッドのIDを取得できます。現在のスレッドが終了した場合、IDは他のスレッドで再利用できます。

Threadのインスタンスを作成すると、スレッドに暗黙的に名前が付けられます。これは、次のパターンです。Thread-number

名前には意味がなく、名前は一意である必要はありません。実行中のすべてのスレッドのIDは一意です。

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()は、現在実行中のスレッドを返します。このオブジェクトは、スレッドのすべての情報を保持します。

于 2019-03-08T09:46:24.033 に答える
7

私はこのようなスレッドIDの例を見ました:

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.
于 2009-05-28T09:11:13.203 に答える
0

identPythonで複数のスレッドを作成し、スレッドオブジェクトを出力し、変数を使用してIDを出力しました。すべてのIDが同じであることがわかります。

<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>
于 2015-06-19T05:31:39.023 に答える
0

@brucexinと同様に、OSレベルのスレッド識別子(!= 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()

ただし、これはCythonによって異なります。

于 2018-03-07T13:04:32.890 に答える