検索
ホームページバックエンド開発Python チュートリアルPython スレッドでの配置と破棄の詳細な紹介 (例付き)

この記事では、Python スレッドでの配置と破棄について詳しく説明します (例とともに)。一定の参考価値があります。困っている友人は参照できます。お役に立てれば幸いです。

仕事が始まる前に何かがおかしいと感じ、自分が責任を負わされるような気がしました。いや、罪悪感を感じるのは勤務3日目です。

モジュールを動的にロードしてスレッドで実行できる素晴らしいバックグラウンド プログラムがあり、これによりプラグインの機能を実現できます。モジュールが更新されると、バックグラウンド プログラム自体は終了せず、モジュールに対応するスレッドを閉じ、コードを更新してから開始するだけです。6 は不可能です。

そこで、自分のスキルを披露するためにモジュールを作成しましたが、exit 関数を書き忘れたため、モジュールが更新されるたびに新しいスレッドが作成されてしまいました。プログラムを再起動しない限り、それらのスレッドは生き続けてください。

これは不可能です。掃除する方法を見つけなければなりません。そうしないと爆発してしまうのではないかと心配です。

それでは、どうやって掃除すればいいのでしょうか?私が思いつくのは 2 つのステップだけです:

  1. クリーンアップする必要があるスレッド番号を見つけます;

  2. それらを破棄します;

スレッド ID を確認する

通常のトラブルシューティングと同様に、まず ps コマンドで対象プロセスのスレッド状態を確認します。 setName、通常は対応するスレッドを参照する必要があります。次のコードを直接使用して、このスレッドをシミュレートします。

マルチスレッドの Python バージョン

#coding: utf8
import threading
import os
import time

def tt():
    info = threading.currentThread()
    while True:
        print 'pid: ', os.getpid()
        print info.name, info.ident
        time.sleep(3)

t1 = threading.Thread(target=tt)
t1.setName('OOOOOPPPPP')
t1.setDaemon(True)
t1.start()

t2 = threading.Thread(target=tt)
t2.setName('EEEEEEEEE')
t2.setDaemon(True)
t2.start()


t1.join()
t2.join()

出力:

root@10-46-33-56:~# python t.py
pid:  5613
OOOOOPPPPP 139693508122368
pid:  5613
EEEEEEEEE 139693497632512
...

Python で出力されたスレッド名が何であるかを確認できます。私たちはそれを設定しましたが、Ps の結果は私に人生を疑わせました:

root@10-46-33-56:~# ps -Tp 5613
  PID  SPID TTY          TIME CMD
 5613  5613 pts/2    00:00:00 python
 5613  5614 pts/2    00:00:00 python
 5613  5615 pts/2    00:00:00 python

通常はこんなはずではありません。少し混乱しています。ずっと間違って覚えていたのでしょうか?別の言語バージョンのマルチスレッドを使用してテストします:

C バージョンのマルチスレッド

#include<stdio.h>
#include<sys>
#include<sys>
#include<pthread.h>

void *test(void *name)
{    
    pid_t pid, tid;
    pid = getpid();
    tid = syscall(__NR_gettid);
    char *tname = (char *)name;
    
    // 设置线程名字
    prctl(PR_SET_NAME, tname);
    
    while(1)
    {
        printf("pid: %d, thread_id: %u, t_name: %s\n", pid, tid, tname);
        sleep(3);
    }
}

int main()
{
    pthread_t t1, t2;
    void *ret;
    pthread_create(&t1, NULL, test,  (void *)"Love_test_1");
    pthread_create(&t2, NULL, test,  (void *)"Love_test_2");
    pthread_join(t1, &ret);
    pthread_join(t2, &ret);
}</pthread.h></sys></sys></stdio.h>

出力:

root@10-46-33-56:~# gcc t.c -lpthread && ./a.out
pid: 5575, thread_id: 5577, t_name: Love_test_2
pid: 5575, thread_id: 5576, t_name: Love_test_1
pid: 5575, thread_id: 5577, t_name: Love_test_2
pid: 5575, thread_id: 5576, t_name: Love_test_1
...

PS コマンドを使用して再度確認します:

root@10-46-33-56:~# ps -Tp 5575
  PID  SPID TTY          TIME CMD
 5575  5575 pts/2    00:00:00 a.out
 5575  5576 pts/2    00:00:00 Love_test_1
 5575  5577 pts/2    00:00:00 Love_test_2

これは正解です。確かに Ps を通してスレッド名が表示されます。

しかし、Python のものが表示されないのはなぜでしょうか?スレッド名は setName を通じて設定されるため、定義を見てみましょう:

[threading.py]
class Thread(_Verbose):
    ...
    @property
    def name(self):
        """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.

        """
        assert self.__initialized, "Thread.__init__() not called"
        return self.__name

    @name.setter
    def name(self, name):
        assert self.__initialized, "Thread.__init__() not called"
        self.__name = str(name)
        
    def setName(self, name):
        self.name = name
    ...

ここで見ているのは、実際には Thread オブジェクトのプロパティを設定しているだけです。ルートに触れていない場合は、非表示になるはずです~

ps または /proc/ を外部に使用することはできなくなったようです Python スレッド名前が検索されるため、Python 内でのみ解決できます。

そこで問題は、Python 内で実行中のすべてのスレッドを取得する方法です。

threading.enumerate はこの問題を完全に解決できます。なぜですか?

次の関数のドキュメントに明確に記載されているため、終了したものと開始されていないものを除く、すべてのアクティブな スレッド オブジェクト が返されます。

[threading.py]

def enumerate():
    """Return a list of all Thread objects currently alive.

    The list includes daemonic threads, dummy thread objects created by
    current_thread(), and the main thread. It excludes terminated threads and
    threads that have not yet been started.

    """
    with _active_limbo_lock:
        return _active.values() + _limbo.values()

Thread オブジェクトを取得しているので、これを通じてスレッドに関連する情報を取得できます。

完全なコード例を参照してください:

#coding: utf8

import threading
import os
import time


def get_thread():
    pid = os.getpid()
    while True:
        ts = threading.enumerate()
        print '------- Running threads On Pid: %d -------' % pid
        for t in ts:
            print t.name, t.ident
        print
        time.sleep(1)
        
def tt():
    info = threading.currentThread()
    pid = os.getpid()
    while True:
        print 'pid: {}, tid: {}, tname: {}'.format(pid, info.name, info.ident)
        time.sleep(3)
        return

t1 = threading.Thread(target=tt)
t1.setName('Thread-test1')
t1.setDaemon(True)
t1.start()

t2 = threading.Thread(target=tt)
t2.setName('Thread-test2')
t2.setDaemon(True)
t2.start()

t3 = threading.Thread(target=get_thread)
t3.setName('Checker')
t3.setDaemon(True)
t3.start()

t1.join()
t2.join()
t3.join()

出力:

root@10-46-33-56:~# python t_show.py
pid: 6258, tid: Thread-test1, tname: 139907597162240
pid: 6258, tid: Thread-test2, tname: 139907586672384

------- Running threads On Pid: 6258 -------
MainThread 139907616806656
Thread-test1 139907597162240
Checker 139907576182528
Thread-test2 139907586672384

------- Running threads On Pid: 6258 -------
MainThread 139907616806656
Thread-test1 139907597162240
Checker 139907576182528
Thread-test2 139907586672384

------- Running threads On Pid: 6258 -------
MainThread 139907616806656
Thread-test1 139907597162240
Checker 139907576182528
Thread-test2 139907586672384

------- Running threads On Pid: 6258 -------
MainThread 139907616806656
Checker 139907576182528
...

コードは少し長く見えますが、ロジックは非常に単純です。Thread-test1 および Thread-test2 は、現在の PID、スレッド ID、およびスレッド名を出力し、3 秒後に終了します。これは、スレッドの通常の終了をシミュレートするためです。

Checker スレッドは、threading.enumerate を通じて現在のプロセス内のすべてのアクティブなスレッドを毎秒出力します。

最初に Thread-test1Thread-test2 の情報が表示されており、終了後は だけが表示されていることがわかります。 MainThreadChecker は、それ自体です。

指定したスレッドを強制終了する

名前とスレッドIDが取得できるので、指定したスレッドを強制終了することもできます。

ここで、Thread-test2 が黒くなり、おかしくなり、それを停止する必要があるとします。その場合、次の方法で解決できます。

上記のコードでは基本的には、次のコードを追加して追加します。

def _async_raise(tid, exctype):
    """raises the exception, performs cleanup if needed"""
    tid = ctypes.c_long(tid)
    if not inspect.isclass(exctype):
        exctype = type(exctype)
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("invalid thread id")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
        raise SystemError("PyThreadState_SetAsyncExc failed")

def stop_thread(thread):
    _async_raise(thread.ident, SystemExit)

def get_thread():
    pid = os.getpid()
    while True:
        ts = threading.enumerate()
        print '------- Running threads On Pid: %d -------' % pid
        for t in ts:
            print t.name, t.ident, t.is_alive()
            if t.name == 'Thread-test2':
                print 'I am go dying! Please take care of yourself and drink more hot water!'
                stop_thread(t)
        print
        time.sleep(1)

Output

root@10-46-33-56:~# python t_show.py
pid: 6362, tid: 139901682108160, tname: Thread-test1
pid: 6362, tid: 139901671618304, tname: Thread-test2
------- Running threads On Pid: 6362 -------
MainThread 139901706389248 True
Thread-test1 139901682108160 True
Checker 139901661128448 True
Thread-test2 139901671618304 True
Thread-test2: I am go dying. Please take care of yourself and drink more hot water!

------- Running threads On Pid: 6362 -------
MainThread 139901706389248 True
Thread-test1 139901682108160 True
Checker 139901661128448 True
Thread-test2 139901671618304 True
Thread-test2: I am go dying. Please take care of yourself and drink more hot water!

pid: 6362, tid: 139901682108160, tname: Thread-test1
------- Running threads On Pid: 6362 -------
MainThread 139901706389248 True
Thread-test1 139901682108160 True
Checker 139901661128448 True
// Thread-test2 已经不在了

しばらくすると、Thread-test2 をこのように扱いますが、それでも引き続き考慮されます :もっと熱いお湯を飲みましょう,

追伸: 熱いお湯も良いですが、8杯で十分なので、欲張らないでください。

本題に戻りますが、上記の方法は非常に大雑把ですが、なぜそう言えるのでしょうか?

その原理は、Python の組み込み API を使用して指定されたスレッドで例外をトリガーし、スレッドが自動的に終了できるようにするためです。 # #この方法は最後の手段として使用しないでください。一定の確率で、言いようのない問題が発生する可能性があります。覚えて!なぜ知っているのかは聞かないでください...

スレッドを停止するのはなぜそれほど難しいのですかPython スレッドでの配置と破棄の詳細な紹介 (例付き)マルチスレッド自体は、プロセス下で協調的に同時実行できるように設計されています。スケジューリングとスレッドがプロセス リソースを共有するため、多くのロック メカニズムと状態制御が存在します。

強制的にスレッドを強制終了すると、予期せぬバグが発生する可能性が高くなります。また、最も重要なロック リソースの解放によって、予期しない問題が発生する可能性もあります。

kill はプロセスを処理することによってのみ期待を達成できるため、シグナルを通じてプロセスを強制終了するのと同じように、スレッドを直接強制終了することもできませんが、スレッドを処理することは明らかに不可能です。殺されると、プロセス全体が終了します。

そして、GIL のせいで、多くの子供たちは、Python のスレッドは Python 自体によって実装されており、実際には存在しないと考えています。Python は直接破棄されるべきですよね?

しかし、実際には、Python のスレッドは本物のスレッドです。 ######それはどういう意味ですか? Python スレッドは、pthread を通じてオペレーティング システムによって作成されるネイティブ スレッドです。 Python は、GIL を使用してこれらのスレッドを制約し、いつスケジュールを開始するかを決定するだけです。たとえば、多数の命令を実行した後、GIL を引き渡します。花魁が誰に勝つかについては、オペレーティング システムによって異なります。

これが単純なスレッドの場合、システムには実際には、

pthread_exit

pthread_killpthread_cancel などのスレッドを終了する方法があります。詳細については、https://www.cnblogs.com/Creat... を参照してください。残念なことに、これらのメソッドは Python レベルでカプセル化されていません。なんてことだ、とても怒っている!糸は優しく扱うべきだと思われているのかもしれません。

スレッドを穏やかに終了する方法

スレッドを穏やかに終了したい場合、それはほとんどナンセンスです~

実行後に終了するか、フラグ ビットを設定して、フラグ ビットを頻繁に確認してください。終了する必要がある場合は、終了してください。

拡張機能

「実行中の子スレッドを正しく終了する方法」: https://www.cnblogs.com/Creat...

「Python スレッドを乱暴に破壊しないでください」 :http://xiaorui.cc/2017/02/22/...


すべての専門家によるアドバイスと交換を歓迎します。QQ ディスカッション グループ: 258498217

転載にご注意ください出典: https://segmentfault.com/a/11...







c

linux
  • # Python

  • # 266 読書                                                             読むのに30分かかります                                                                                                                          



    # 8

                                                                                                                                                                                                                                                                                                                                                                                      背景仕事を始める前に何かがおかしいと感じ、自分が責任を負わされるような気がしました。いや、罪悪感を感じるのは勤務3日目です。

    そこで、自分のスキルを披露するためにモジュールを作成しましたが、exit 関数を書き忘れたため、モジュールが更新されるたびに新しいスレッドが作成されてしまいました。プログラムを再起動しない限り、それらのスレッドは生き続けてください。

    これは不可能です。掃除する方法を見つけなければなりません。そうしないと爆発してしまうのではないかと心配です。

    それでは、どうやって掃除すればいいのでしょうか?私が思いつくのは 2 つのステップだけです:

    クリーンアップする必要があるスレッド番号を見つけます;

    それらを破棄します;

    スレッド ID を確認する
    1. 通常のトラブルシューティングと同様に、まず ps コマンドで対象プロセスのスレッド状態を確認します。 setName、通常は対応するスレッドを参照する必要があります。次のコードを直接使用して、このスレッドをシミュレートします。

      マルチスレッドの Python バージョン
    2. #coding: utf8
      import threading
      import os
      import time
      
      def tt():
          info = threading.currentThread()
          while True:
              print 'pid: ', os.getpid()
              print info.name, info.ident
              time.sleep(3)
      
      t1 = threading.Thread(target=tt)
      t1.setName('OOOOOPPPPP')
      t1.setDaemon(True)
      t1.start()
      
      t2 = threading.Thread(target=tt)
      t2.setName('EEEEEEEEE')
      t2.setDaemon(True)
      t2.start()
      
      
      t1.join()
      t2.join()
    3. 出力:

      root@10-46-33-56:~# python t.py
      pid:  5613
      OOOOOPPPPP 139693508122368
      pid:  5613
      EEEEEEEEE 139693497632512
      ...
      Python で出力されたスレッド名が何であるかを確認できます。私たちはそれを設定しましたが、Ps の結果は私に人生を疑わせました:
    4. root@10-46-33-56:~# ps -Tp 5613
        PID  SPID TTY          TIME CMD
       5613  5613 pts/2    00:00:00 python
       5613  5614 pts/2    00:00:00 python
       5613  5615 pts/2    00:00:00 python
    通常はこんなはずではありません。少し混乱しています。ずっと間違って覚えていたのでしょうか?別の言語バージョンのマルチスレッドを使用してテストします:

    C バージョンのマルチスレッド

    #include<stdio.h>
    #include<sys>
    #include<sys>
    #include<pthread.h>
    
    void *test(void *name)
    {    
        pid_t pid, tid;
        pid = getpid();
        tid = syscall(__NR_gettid);
        char *tname = (char *)name;
        
        // 设置线程名字
        prctl(PR_SET_NAME, tname);
        
        while(1)
        {
            printf("pid: %d, thread_id: %u, t_name: %s\n", pid, tid, tname);
            sleep(3);
        }
    }
    
    int main()
    {
        pthread_t t1, t2;
        void *ret;
        pthread_create(&t1, NULL, test,  (void *)"Love_test_1");
        pthread_create(&t2, NULL, test,  (void *)"Love_test_2");
        pthread_join(t1, &ret);
        pthread_join(t2, &ret);
    }</pthread.h></sys></sys></stdio.h>
    出力:

    root@10-46-33-56:~# gcc t.c -lpthread && ./a.out
    pid: 5575, thread_id: 5577, t_name: Love_test_2
    pid: 5575, thread_id: 5576, t_name: Love_test_1
    pid: 5575, thread_id: 5577, t_name: Love_test_2
    pid: 5575, thread_id: 5576, t_name: Love_test_1
    ...
    PS コマンドを使用して再度確認します:

    root@10-46-33-56:~# ps -Tp 5575
      PID  SPID TTY          TIME CMD
     5575  5575 pts/2    00:00:00 a.out
     5575  5576 pts/2    00:00:00 Love_test_1
     5575  5577 pts/2    00:00:00 Love_test_2
    これは正解です。確かに Ps を通してスレッド名が表示されます。

    しかし、Python のものが表示されないのはなぜでしょうか?スレッド名は

    setName

    を通じて設定されるため、定義を見てみましょう:

    [threading.py]
    class Thread(_Verbose):
        ...
        @property
        def name(self):
            """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.
    
            """
            assert self.__initialized, "Thread.__init__() not called"
            return self.__name
    
        @name.setter
        def name(self, name):
            assert self.__initialized, "Thread.__init__() not called"
            self.__name = str(name)
            
        def setName(self, name):
            self.name = name
        ...
    ここで見ているのは、実際には

    Thread

    オブジェクトのプロパティを設定しているだけです。ルートに触れていない場合は、非表示になるはずです~

    ps

    または

    /proc/ を外部に使用することはできなくなったようです Python スレッド名前が検索されるため、Python 内でのみ解決できます。

    そこで問題は、Python 内で実行中のすべてのスレッドを取得する方法です。

    threading.enumerate

    はこの問題を完全に解決できます。なぜですか?

    次の関数のドキュメントに明確に記載されているため、終了したものと開始されていないものを除く、すべてのアクティブな スレッド オブジェクト が返されます。

    [threading.py]
    
    def enumerate():
        """Return a list of all Thread objects currently alive.
    
        The list includes daemonic threads, dummy thread objects created by
        current_thread(), and the main thread. It excludes terminated threads and
        threads that have not yet been started.
    
        """
        with _active_limbo_lock:
            return _active.values() + _limbo.values()
    Thread オブジェクトを取得しているので、これを通じてスレッドに関連する情報を取得できます。

    完全なコード例を参照してください:

    #coding: utf8
    
    import threading
    import os
    import time
    
    
    def get_thread():
        pid = os.getpid()
        while True:
            ts = threading.enumerate()
            print '------- Running threads On Pid: %d -------' % pid
            for t in ts:
                print t.name, t.ident
            print
            time.sleep(1)
            
    def tt():
        info = threading.currentThread()
        pid = os.getpid()
        while True:
            print 'pid: {}, tid: {}, tname: {}'.format(pid, info.name, info.ident)
            time.sleep(3)
            return
    
    t1 = threading.Thread(target=tt)
    t1.setName('Thread-test1')
    t1.setDaemon(True)
    t1.start()
    
    t2 = threading.Thread(target=tt)
    t2.setName('Thread-test2')
    t2.setDaemon(True)
    t2.start()
    
    t3 = threading.Thread(target=get_thread)
    t3.setName('Checker')
    t3.setDaemon(True)
    t3.start()
    
    t1.join()
    t2.join()
    t3.join()
    出力:
    root@10-46-33-56:~# python t_show.py
    pid: 6258, tid: Thread-test1, tname: 139907597162240
    pid: 6258, tid: Thread-test2, tname: 139907586672384
    
    ------- Running threads On Pid: 6258 -------
    MainThread 139907616806656
    Thread-test1 139907597162240
    Checker 139907576182528
    Thread-test2 139907586672384
    
    ------- Running threads On Pid: 6258 -------
    MainThread 139907616806656
    Thread-test1 139907597162240
    Checker 139907576182528
    Thread-test2 139907586672384
    
    ------- Running threads On Pid: 6258 -------
    MainThread 139907616806656
    Thread-test1 139907597162240
    Checker 139907576182528
    Thread-test2 139907586672384
    
    ------- Running threads On Pid: 6258 -------
    MainThread 139907616806656
    Checker 139907576182528
    ...
    コードは少し長く見えますが、ロジックは非常に単純です。

    Thread-test1 および Thread-test2

    は、現在の PID、スレッド ID、およびスレッド名を出力し、3 秒後に終了します。これは、スレッドの通常の終了をシミュレートするためです。

    Checker

    スレッドは、

    threading.enumerate

    を通じて現在のプロセス内のすべてのアクティブなスレッドを毎秒出力します。

    最初に Thread-test1Thread-test2

    の情報が表示されており、終了後は

    だけが表示されていることがわかります。 MainThreadChecker は、それ自体です。

    指定したスレッドを強制終了する

    名前とスレッドIDが取得できるので、指定したスレッドを強制終了することもできます。 ここで、Thread-test2 が黒くなり、おかしくなり、それを停止する必要があるとします。その場合、次の方法で解決できます。 上記のコードでは基本的には、次のコードを追加して追加します。

    def _async_raise(tid, exctype):
        """raises the exception, performs cleanup if needed"""
        tid = ctypes.c_long(tid)
        if not inspect.isclass(exctype):
            exctype = type(exctype)
        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
        if res == 0:
            raise ValueError("invalid thread id")
        elif res != 1:
            ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
            raise SystemError("PyThreadState_SetAsyncExc failed")
    
    def stop_thread(thread):
        _async_raise(thread.ident, SystemExit)
    
    def get_thread():
        pid = os.getpid()
        while True:
            ts = threading.enumerate()
            print '------- Running threads On Pid: %d -------' % pid
            for t in ts:
                print t.name, t.ident, t.is_alive()
                if t.name == 'Thread-test2':
                    print 'I am go dying! Please take care of yourself and drink more hot water!'
                    stop_thread(t)
            print
            time.sleep(1)
    Output

    root@10-46-33-56:~# python t_show.py
    pid: 6362, tid: 139901682108160, tname: Thread-test1
    pid: 6362, tid: 139901671618304, tname: Thread-test2
    ------- Running threads On Pid: 6362 -------
    MainThread 139901706389248 True
    Thread-test1 139901682108160 True
    Checker 139901661128448 True
    Thread-test2 139901671618304 True
    Thread-test2: I am go dying. Please take care of yourself and drink more hot water!
    
    ------- Running threads On Pid: 6362 -------
    MainThread 139901706389248 True
    Thread-test1 139901682108160 True
    Checker 139901661128448 True
    Thread-test2 139901671618304 True
    Thread-test2: I am go dying. Please take care of yourself and drink more hot water!
    
    pid: 6362, tid: 139901682108160, tname: Thread-test1
    ------- Running threads On Pid: 6362 -------
    MainThread 139901706389248 True
    Thread-test1 139901682108160 True
    Checker 139901661128448 True
    // Thread-test2 已经不在了

    しばらくすると、

    Thread-test2

    をこのように扱いますが、それでも引き続き考慮されます :

    もっと熱いお湯を飲みましょう,

    追伸: 熱いお湯も良いですが、8杯で十分なので、欲張らないでください。

    本題に戻りますが、上記の方法は非常に大雑把ですが、なぜそう言えるのでしょうか?

    その原理は、Python の組み込み API を使用して指定されたスレッドで例外をトリガーし、スレッドが自動的に終了できるようにするためです。 # #この方法は最後の手段として使用しないでください。一定の確率で、言いようのない問題が発生する可能性があります。覚えて!なぜ知っているのかは聞かないでください...

    スレッドを停止するのはなぜそれほど難しいのですかPython スレッドでの配置と破棄の詳細な紹介 (例付き)マルチスレッド自体は、プロセス下で協調的に同時実行できるように設計されています。スケジューリングとスレッドがプロセス リソースを共有するため、多くのロック メカニズムと状態制御が存在します。

    強制的にスレッドを強制終了すると、予期せぬバグが発生する可能性が高くなります。また、最も重要なロック リソースの解放によって、予期しない問題が発生する可能性もあります。

    kill はプロセスを処理することによってのみ期待を達成できますが、スレッドを処理することは明らかに不可能であるため、シグナルを通じてプロセスを強制終了するのと同じように、スレッドを直接強制終了することさえできません。どのスレッドが強制終了されると、プロセス全体が終了します。

    そして、GIL のせいで、多くの子供たちは、Python のスレッドは Python 自体によって実装されており、実際には存在しないと考えています。Python はスレッドを直接破棄できるはずですよね。

    しかし、実際には、Python のスレッドは本物のスレッドです。 ######それはどういう意味ですか? Python スレッドは、pthread を通じてオペレーティング システムによって作成されるネイティブ スレッドです。 Python は、GIL を使用してこれらのスレッドを制約し、いつスケジュールを開始するかを決定します。たとえば、多数の命令を実行した後、GIL が引き渡されます。花魁が誰に勝つかについては、オペレーティング システムによって異なります。

    これが単純なスレッドの場合、システムには実際には、

    pthread_exit

    pthread_kill

    pthread_cancel

    などのスレッドを終了する方法があります。詳細については、https://www.cnblogs.com/Creat...

    を参照してください。残念なことに、これらのメソッドは Python レベルでカプセル化されていません。なんてことだ、とても怒っている!糸は優しく扱うべきだと思われているのかもしれません。

    スレッドを穏やかに終了する方法スレッドを穏やかに終了したい場合、それはほとんどナンセンスです~実行後に終了するか、フラグ ビットを設定して、フラグ ビットを頻繁に確認してください。終了する必要がある場合は、終了してください。

    拡張機能

    「実行中の子スレッドを正しく終了する方法」: https://www.cnblogs.com/Creat...

    「Python スレッドを乱暴に破壊しないでください」 :http://xiaorui.cc/2017/02/22/...

    すべての専門家によるアドバイスと交換を歓迎します。QQ ディスカッション グループ: 258498217

    Ming ソースの転載についてはご注意ください: https://segmentfault.com/a/11...


    無断転載禁止
    ## #### ########################報告#####################

    • #私の記事が役に立ったと思われる場合は、お気軽に評価してください
    • 興味があるかもしれません

    ##2 コメント

                                                                                               時間の並べ替え



                                                                                               

    ### ・ 1日前###


    私だったら、-9人を殺すかもしれませんが、1人を手放すよりは誤って1000人を殺したほうがいいです、へへ

                                                                              ###いいぞ###                                                                                                                   ###返事###                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      


    ##まさか~ -9 プロセスはすべて停止しています~

                                                                                                                                                                                                                                                                                                                                                                                                                                                                         —                                                                                                                                                                                                                                                                                        著者 ### ### ・ 1日前###                                                                                                    返信を追加読み込み中...コメントをさらに表示

    ##

以上がPython スレッドでの配置と破棄の詳細な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
C语言中的常量是什么,可以举一个例子吗?C语言中的常量是什么,可以举一个例子吗?Aug 28, 2023 pm 10:45 PM

常量也称为变量,一旦定义,其值在程序执行期间就不会改变。因此,我们可以将变量声明为引用固定值的常量。它也被称为文字。必须使用Const关键字来定义常量。语法C编程语言中使用的常量语法如下-consttypeVariableName;(or)consttype*VariableName;不同类型的常量在C编程语言中使用的不同类型的常量如下所示:整数常量-例如:1,0,34,4567浮点数常量-例如:0.0,156.89,23.456八进制和十六进制常量-例如:十六进制:0x2a,0xaa..八进制

VSCode和VS C++IntelliSense无法工作或拾取库VSCode和VS C++IntelliSense无法工作或拾取库Feb 29, 2024 pm 01:28 PM

VS代码和VisualStudioC++IntelliSense可能无法拾取库,尤其是在处理大型项目时。当我们将鼠标悬停在#Include<;wx/wx.h>;上时,我们看到了错误消息“CannotOpen源文件‘string.h’”(依赖于“wx/wx.h”),有时,自动完成功能无法响应。在这篇文章中,我们将看到如果VSCode和VSC++IntelliSense不能工作或不能提取库,你可以做些什么。为什么我的智能感知不能在C++中工作?处理大文件时,IntelliSense有时

修复Xbox错误代码8C230002修复Xbox错误代码8C230002Feb 27, 2024 pm 03:55 PM

您是否由于错误代码8C230002而无法在Xbox上购买或观看内容?一些用户在尝试购买或在其控制台上观看内容时不断收到此错误。抱歉,Xbox服务出现问题。稍后再试.有关此问题的帮助,请访问www.xbox.com/errorhelp。状态代码:8C230002这种错误代码通常是由于暂时的服务器或网络问题引起的。但是,还有可能是由于帐户的隐私设置或家长控制等其他原因,这些可能会阻止您购买或观看特定内容。修复Xbox错误代码8C230002如果您尝试在Xbox控制台上观看或购买内容时收到错误代码8C

递归程序在C++中找到数组的最小和最大元素递归程序在C++中找到数组的最小和最大元素Aug 31, 2023 pm 07:37 PM

我们以整数数组Arr[]作为输入。目标是使用递归方法在数组中找到最大和最小的元素。由于我们使用递归,我们将遍历整个数组,直到达到长度=1,然后返回A[0],这形成了基本情况。否则,将当前元素与当前最小或最大值进行比较,并通过递归更新其值以供后续元素使用。让我们看看这个的各种输入输出场景&minus;输入&nbsp;&minus;Arr={12,67,99,76,32};输出&nbsp;&minus;数组中的最大值:99解释&nbsp;&mi

中国东方航空宣布C919客机即将投入实际运营中国东方航空宣布C919客机即将投入实际运营May 28, 2023 pm 11:43 PM

5月25日消息,中国东方航空在业绩说明会上披露了关于C919客机的最新进展。据公司表示,与中国商飞签署的C919采购协议已于2021年3月正式生效,其中首架C919飞机已在2022年底交付。预计不久之后,该飞机将正式投入实际运营。东方航空将以上海为主要基地进行C919的商业运营,并计划在2022年和2023年引进总共5架C919客机。公司表示,未来的引进计划将根据实际运营情况和航线网络规划来确定。据小编了解,C919是中国具有完全自主知识产权的全球新一代单通道干线客机,符合国际通行的适航标准。该

C++程序打印数字的螺旋图案C++程序打印数字的螺旋图案Sep 05, 2023 pm 06:25 PM

以不同格式显示数字是学习基本编码问题之一。不同的编码概念,如条件语句和循环语句。有不同的程序中,我们使用特殊字符(如星号)来打印三角形或正方形。在本文中,我们将以螺旋形式打印数字,就像C++中的正方形一样。我们将行数n作为输入,然后从左上角开始移向右侧,然后向下,然后向左,然后向上,然后再次向右,以此类推等等。螺旋图案与数字123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

23 年来首次,C# 获得了 TIOBE 2023 年度编程语言奖23 年来首次,C# 获得了 TIOBE 2023 年度编程语言奖Jan 11, 2024 pm 04:45 PM

根据TIOBE编程社区指数,该指数是衡量编程语言受欢迎程度的标准之一,通过收集来自全球工程师、课程、供应商和搜索引擎的数据进行评估。2024年1月TIOBE指数于近日发布,同时官方公布了2023年编程语言排名,C#荣获TIOBE2023年度编程语言,这是23年来C#首次拿下这一荣誉。TIOBE官方新闻稿称,C#已经稳居前10名长达20多年,如今它正在追赶四大语言,成为一年内涨幅最大的编程语言(+1.43%),当之无愧地获得了该奖项。排名第二的是Scratch(+0.83%)和Fortran(+0

C语言中的void关键字的作用C语言中的void关键字的作用Feb 19, 2024 pm 11:33 PM

C中的void是一个特殊的关键字,用来表示空类型,也就是指没有具体类型的数据。在C语言中,void通常用于以下三个方面。函数返回类型为void在C语言中,函数可以有不同的返回类型,例如int、float、char等。然而,如果函数不返回任何值,则可以将返回类型设为void。这意味着函数执行完毕后,并不返回具体的数值。例如:voidhelloWorld()

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません