ホームページ >バックエンド開発 >Python チュートリアル >前回の記事で Python のプロセスとスレッドを深く理解しました
プロセスとスレッドはオペレーティング システムの基本概念です。これらの間にはいくつかの長所、短所、相違点があります。では、Python でプロセスとスレッドを使用するにはどうすればよいでしょうか?
コンピュータの核となるのは CPU であり、コンピュータのすべての計算タスクを引き受けます。CPU は工場のようなもので、常に稼働しており、オペレーティング システムがコンピュータを管理します。タスクのスケジューリング、リソースの割り当て、管理を担当します。
プロセスとは、システム内で独立して実行できる基本単位を指し、リソース割り当ての基本単位として使用されます。機械命令、データ、およびデータのセットで構成されます。スタックなど、独立して実行できるプロセスです。アクティビティ エンティティ。
コンピューターを開くとプロセスとスレッドが表示されます。[マイ コンピューター] をクリックして CPU の動作を確認します。
図に示すように、CPU は合計 190 のプロセスと 2620 のスレッドを実行しています。たとえば、[QQ] を再度クリックして別のアカウントにログインすると、別の QQ プロセスが開きます。
つまり、コンピューター上で複数の WeChat にログインしたい場合です。 WeChat ショートカットを見つけて、右クリックしてプロパティを表示し、ターゲット内のリンクをコピーします。新しいメモ帳を作成し、ランダムな名前を付け、ダブルクリックして開き、「start ""
」と入力します。英語で (引用符に注意してください)、前後にスペースを入れて)、コピーしたリンク (つまり、WeChat インストールへのパス) を貼り付けてから、行全体をコピーし、次のように開きたい場合は数行を貼り付けます。できるだけ多くの WeChat アカウントを作成し、ファイルを保存し、サフィックスを Bat に変更します。ダブルクリックするだけで実行できます。
スレッド(Thread)は軽量プロセスとも呼ばれ、オペレーティングシステムが計算スケジューリングを実行できる最小単位です。プロセス中。 は、プロセス中の実際の操作単位です。
Ruan Yifeng が書いたブログを思い出します。工場内の電力は限られており、一度に 1 つの作業場にしか供給できないと仮定します。言い換えれば、1 つのワークショップが動作し始めると、他のワークショップは動作を停止する必要があります。その背後にある意味は、1 つの CPU は一度に 1 つのタスクしか実行できないということです。
#プロセスは工場現場のようなもので、CPU が処理できる単一のタスクを表します。 CPU は常に 1 つのプロセスを実行しており、他のプロセスは非実行状態になります。
スレッドはワークショップの労働者のようなものです。プロセスには、タスクを完了するために連携して動作する複数のスレッドを含めることができます。
要約: プログラムには複数のプロセスを含めることができ、複数のプロセスは同時に実行され、互いに独立しているため、プロセスはシステム内のリソース割り当てとスケジューリングの基本単位でもあります。技術的に言えば、プロセスは実行時のプログラムのインスタンスです。スレッドは最小の実行単位であり、プロセスは少なくとも 1 つのスレッドで構成されます。プロセスとスレッドがどのようにスケジュールされるかは、オペレーティング システムによって完全に決定されます。
次に、Python でのスレッドとプロセスの使用について説明します。
Python では、スレッドのサポートは 2 つの標準ライブラリ thread
と Threading
を通じて提供されます。threading
は thread## をサポートします #カプセル化されています。
threading モジュールは、
Thread、
Lock、
RLOCK、
Condition およびその他のコンポーネント
_thread モジュールと
threading モジュールにあります。通常、
スレッドを通じてインポートします。
>> from threading import Thread复制代码次に、Thread クラスの共通パラメータの説明とインスタンス メソッドを示します。 公式ドキュメントにある標準的なマルチスレッドの例を見てみましょう。
import threading import time # 定义线程要运行的函数 def func(name): # 为了便于观察,睡眠2秒 time.sleep(2) print("My name is %s\t" % name) # 创建第一个线程的实例,args参数是一个元组,后面必须加逗号分隔 t1 = threading.Thread(target=func, args=("Runsen",)) # 创建第二个线程的实例 t2 = threading.Thread(target=func, args=("Maoli",)) t1.start() t2.start() # 先打印线程名 print(t1.getName()) print(t2.getName())复制代码2 つのスレッドが同時に実行されているため、
print の結果には改行がありません。
# -*- coding:utf-8 -*-# time :2019/4/9 21:52# author: Runsenimport threadingimport timedef fun1(): print('hello') time.sleep(2) print('Bye')def fun2(): print('hi') time.sleep(2) print('OUT') t1 = threading.Thread(target=fun1) t2 = threading.Thread(target=fun2) t1.start() t2.start()# t1.join()# t2.join()print('主线程完毕')复制代码以下は出力です。
hello hi 主线程完毕 Bye OUT复制代码
我们先不加join()
来阻塞,t1
和t2
两个线程同时执行,由于位置关系先打印hello
,再打印hi
,这个时候都sleep2秒钟,但是它sleep2秒钟,主程序还是在执行,所以下面打印print('主线程完毕')
,最后才打印Bye
和OUT
。
在多线程中,所有变量对于所有线程都是共享的,因此,线程之间共享数据的最大危险在于多个线程同时修改一个变量,那就乱套了,所以我们需要互斥锁,来锁住数据。
代码如上图所示,上面代码中打印的a是1还是2?
答案是:2。因为出现了global
关键字,线程间变量的共享,在func
函数中的a
是全局变量。因此在函数中a的值发生了变化。
下面,我们提高一点点难度,代码如下图所示,还是猜一猜a是啥东西。注意:这里出现了join来阻塞,并且增加了加和减的操作。
相信很多人都认为是0,其实这个a的值是变化的,可能这次是0 ,下次是1,还有可能是1000000
,比如,我可以
a就是在[-1000000,1000000]
中的一个随机数。
为什么呢?这是因为虽然他们是同时运行的,但是同时在修改我们的a,那就乱了。a在for i in range(1000000)
,就是遍历了1000000
,incr
和decr
的方法都加上一起了,在这1000000
次遍历中,不知道有多少加,多少减,比如,我1000000都是加,没有减,a就是1000000,但是这种情况的概率很低。
如果你就是想出现0,其实只需要加一个互斥锁就可以了。这样你加多少次,我就减多少次,加减的次数不会叠加。因此来了lock的用法,具体代码如下图所示。
这个a怎么运行都是 0。因为我们把这个a锁上了,这样就加1000000次,减1000000次,怎么出来都是我们的0。
相关免费学习推荐:python视频教程
以上が前回の記事で Python のプロセスとスレッドを深く理解しましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。