ディレクトリ
pythonday31
イベントイベント
イベントイベントアクション:
スレッドの実行を制御するために使用します
他のスレッドを制御するスレッドの数により、
from threading import Event
from threading import Thread
import time
#调用Event类实例化一个对象
e = Event()
#若该方法出现在任务中,则False阻塞 #e.wait() #False
#若该方法出现在任务中,则将其他线程的False改为True,进入就绪态与运行态 e.set() #True
def light():
print('红灯...')
time.sleep(1)
#应该开始发送信号,告诉其他线程准备执行
e.set() #将car中的False ---> True
print('绿灯...')
def car(name):
print('等红灯...')
#让所有汽车进入阻塞
e.wait() #False
print(f'{name}启动...')
#让一个light线程任务控制多个car线程任务
t = Thread(target = light)
t.start()
for line in range(10):
t = Thread(target=car,args=(f'CART{line}'))
t.start()
スレッドプールとプロセスプール
プロセスプールとスレッドプールとは何ですか
プロセスプールとスレッドプールは現在のプログラムを制御するために使用される作成(プロセス/スレッド)の数を可能にします
プロセスプールとスレッドプールの役割
ハードウェアの範囲で作成した数(プロセス/スレッド)が可能となることを確認してください
コードの実装
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time
#ProcessPoolExecutor(5) #5代表只能开启5个进程,不填写,默认以CPU的个数限制进程数
pool = ThreadPoolExecutor(5) #代表5个线程,不填写,默认以CPU个数*5限制线程数
def task():
print('任务开始...')
time.sleep(1)
print('任务结束...')
for line in range(5):
pool.submit(task)
コールバック関数
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import time
def task(res):
print('任务开始...')
time.sleep(1)
print('任务结束...')
return 123
# 回调函数
def call_back(res):
print(type(res))
res2 = res.result()
print(res2)
for line in range(5):
pool.submit(task, 1).add_done_callback(call_back)
コルーチン
コルーチンの役割
プロセス:リソースユニット
スレッド:実装ユニット
コルーチン:シングルスレッドの同時実行で
注意:コルーチンないオペレーティングシステムリソース、それがシングルスレッドの同時実行を行うことができるようにするために、プログラムの名前であるため、
コルーチン目的
オペレーティングシステム:
オペレーティングシステム、スレッドとマルチチャネル技術、スレッドは、スイッチングおよび状態を保存します
1. 遇到IO事件
2. 当占用CPU执行时间过长
コルーチン:
手動切り替えステートセーブを達成するためのシステムシミュレーション「マルチチャンネル・テクノロジー」を、動作させることにより+
IOは、出会いを実現するために、手動で切り替えます
シングルスレッドのIO、保存のスイッチング状態に遭遇しました+
計算集約的なねじ切りが、前後に+保存された状態の効率が低下切り替えます
利点:
IO集中型の場合には、効率を向上させます
短所:
ダウン計算集約スイッチバックの場合であれば、しかし、効率が低下します
コルーチンを使用してください
収量:、状態を保存し、保存し、多くのスレッドなどのオペレーティングシステムの保全状況の状態を得ることができyiled、
しかし、収量は、より軽量なコードレベルコントロールです
同時実行:スイッチ
#串行执行
import time
def consumer(res):
'''任务1:接收数据,处理数据'''
pass
def producer():
'''任务2:生产数据'''
res=[]
for i in range(10000000):
res.append(i)
return res
start=time.time()
#串行执行
res=producer()
consumer(res) #写成consumer(producer())会降低执行效率
stop=time.time()
print(stop-start) #1.5536692142486572
#基于yield并发执行
import time
def consumer():
'''任务1:接收数据,处理数据'''
while True:
x=yield
def producer():
'''任务2:生产数据'''
g=consumer()
next(g)
for i in range(10000000):
g.send(i)
start=time.time()
#基于yield保存状态,实现两个任务直接来回切换,即并发的效果
#PS:如果每个任务中都加上打印,那么明显地看到两个任务的打印是你一次我一次,即并发执行的.
producer()
stop=time.time()
print(stop-start)