[TOC]
ロックグローバルインタプリタ
1.1pythonインタプリタ:
-Cpython C言語
-Jpythonのjava
1.2GIL:グローバルインタプリタ
- 翻訳:同じプロセスの複数のスレッドの下で、オープンで、同じ時間だけつのスレッドの実行、メモリマネージャは、安全のCPythonのスレッドされていないため。
-GILグローバルインタプリタ、データのセキュリティを確保するために、本質的に、ミューテックス
、CPythonの解釈に同じプロセスの下で、マルチコアの利点を活用することができない複数のスレッドが同時に実行のスレッドを1つだけ、開きました。
- なぜ、グローバルインタプリタロックを持っています:
- ロックなし
-GILグローバルインタプリタロックの利点:
- 利点:
データのセキュリティを確保
- 短所:
単一プロセスの下で、オープン複数のスレッドは、効率を犠牲にし、並行して達成することができないだけを同時に達成することができます。
-IOインテンシブ:マルチスレッド
- コンピュータ集約型:マルチプロセス
import time
from threading import Thread
n = 100
def task():
global n
m = n
time.sleep(3)
n =m -1####实际产生了10个99 最后一个只打印了一个n
#print(n)
if __name__ == '__main__':
list = []
for line in range(10):
t = Thread(target = task)
t.start()
list.append(t)
for t in list:
t.join()
print(n)
>>>>>>>>>>>>>>>>>>>>>>
99
2.コルーチン
- 定義:
- プロセス:リソースユニット
- スレッド:実装ユニット
- コルーチン:シングルスレッドの同時実行西
- IO集中型の場合には、コルーチンは、最大の効率を向上させることができます
注:コルーチンを使用してコルーチンいないユニットは、最大の効率を向上させることができます
コルーチンの目的:
- タスクの遭遇におけるシングルスレッド、シングルスレッドコントロール複数のタスクがioを、それが、あなたがこのようにして最大のスレッドに、確実に、別のタスクの実行に切り替えているので、手動で、「保存の出会いIO +切替状態」を実現します制限は、あなたはとてもあなたのCPUを実行する権限を与える誤って操作ioの考えオペレーティングシステムが、存在しない、オペレーティングシステムを欺くために行くことができ、CPUの状態を常に実行することができていること、準備がです。
- 、唯一のシングルスレッドの同時実行がなければなりません
- コルーチンは、スレッドジャム一度、単一のスレッドを指し、それは全体のスレッドをブロックします
from gevent import monkey # 猴子补丁
monkey.patch_all() # 监听所有的任务是否有IO操作
#上面的2个必须写在文件的开头,在time socket的模块之前,这样形成的io 可以直接识别
from gevent import spawn # spawn(任务) spawn(函数名,参数,参数)
from gevent import joinall
import time
def task1():
print('start from task1...')
time.sleep(1)
print('end from task1...')
def task2():
print('start from task2...')
time.sleep(3)
print('end from task2...')
def task3():
print('start from task3...')
time.sleep(5)
print('end from task3...')
if __name__ == '__main__':
start_time = time.time()
sp1 = spawn(task1)
sp2 = spawn(task2)
sp3 = spawn(task3)
# sp1.start()
# sp2.start()
# sp3.start()
# sp1.join()
# sp2.join()
# sp3.join()
joinall([sp1, sp2, sp3])
end_time = time.time()
print(f'消耗时间: {end_time - start_time}')
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start task1...
start task2...
start task3...
end task1...
end task2...
end task3...
消耗时间:3.0044186115264893
効率を改善する3.複数のスレッド
from threading import Thread
from multiprocessing import Process
import time
#计算密集型任务
def task1():
i = 10
for line in range(1000000):
i += 1
#io密集型任务
def task2():
time.sleep(3)
if __name__ == '__main__':
#测试多进程
#计算密集型
a = time.time()
list1 = []
for line in range(6):
p = Process(target = task1)
print(p)
p.start()
list1.append(p)
for p in list1:
p.join()
b = time.time()
print(f'计算进程密集型消耗的时间:{b-a}')
#测试IO密集型
a = time.time()
list2 = []
for line in range(6):
p = Process(target = task2)
p.start()
list2.append(p)
for p in list2:
p.join()
b = time.time()
print(f'IO进程密集型消耗时间:{b-a}')
#2.测试多线程的
#测试计算密集型
a = time.time()
list1 = []
for line in range(6):
p = Thread(target = task1)
p.start()
list1.append(p)
for p in list1:
p.join()
b = time.time()
print(f'计算线程密集型消耗时间:{b -a}')
#测试IO密集型
a = time.time()
list1 = []
for line in range(6):
p = Thread(target = task2)
p.start()
list1.append(p)
for p in list1:
p.join()
b = time.time()
print(f'IO线程密集型的消耗时间:{b - a}')
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
计算进程密集型消耗的时间:0.3511178493499756
IO进程密集型消耗时间:3.215735912322998
计算线程密集型消耗时间:0.43486547470092773
IO线程密集型的消耗时间:3.003101110458374