シングルスレッドのマルチタイムタスク
1. 初期バージョン:
アイデア: 率直に言えば、タイマーは、指定されたプログラムの実行を遅延させます。 Python のタイマーを自分で設定することはできないため、遅延操作にはシステム タイマーを使用する必要がありますが、操作をスケジュールする必要があるすべてのプログラムを特定のリストに追加して、プログラムを取り出すことができます。リスト内の最も短いタイミング時間を取得し、Bind threading.Timer (時間、コールバック) を実行し、タイムアウトになるのを待ち、カスタム コールバックをトリガーし、リストから取り出したばかりのプログラムを実行して時間を更新します。リスト内の最も短い時間のプログラムを再度取り出し、継続的な反復ループである threading.Timer のバインドを続けます。新しいスケジュールされたタスクがリストに追加されると、現在の threading.Timer バインドがキャンセルされ、リスト内の時間を更新します。 、再度最短時間を取り出し、スレッドをバインドします。タイマー...
import threading
import time
class Timer():
'''单线程下的定时器'''
def __init__(self):
self.queues = []
self.timer = None
self.last_time = time.time()
def start(self):
item = self.get()
if item:
self.timer = threading.Timer(item[0],self.execute)
self.timer.start()
def add(self,item):
print('add',item)
self.flush_time()
self.queues.append(item)
self.queues.sort(key=lambda x:x[0])
if self.timer:
self.timer.cancel()
self.timer = None
self.start()
def get(self):
item = None
if len(self.queues) > 0:
item = self.queues[0]
return item
def pop(self):
item = None
if len(self.queues) > 0:
item = self.queues.pop(0)
return item
def flush_time(self):
curr_time = time.time()
for i in self.queues:
i[0] = i[0] - (curr_time - self.last_time)
self.last_time = curr_time
def execute(self):
# if self.timer:
# self.timer.cancel()
# self.timer = None
item = self.pop()
self.flush_time()
if item:
callback = item[1]
args = item[0]
callback(args)
self.start()
注: コード出力を表示します。すべてのタイマーが調整されています。時間は順番に実行され、非常に完璧で、すべてが非常に良好に見えます。しかし、どうやら、ははは、func で time.sleep(5) を有効にすると、スレッドの数がゆっくりと増加します。理由は最後のタイマーのコールバックです。まだ実行中ですが、この時点で新しいスレッドが追加されました
if __name__ == '__main__': # 检测线程数
def func(): while True: print(threading.active_count())
time.sleep(1)
f1 = threading.Thread(target=func)
f1.start()
import logging
logging.basicConfig(level=logging.INFO,format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]") def func1(*args):
logging.info('func1 %s'%args) # time.sleep(5)
def func2(*args):
logging.info('func2 %s' % args) # time.sleep(5)
def func3(*args):
logging.info('func3 %s' % args) # time.sleep(5)
def func4(*args):
logging.info('func4 %s' % args) # time.sleep(5)
def func5(*args):
logging.info('func5 %s' % args) # time.sleep(5)
# 测试
t1 = Timer()
logging.info('start')
t1.add([5,func1])
time.sleep(0.5)
t1.add([4,func2])
time.sleep(0.5)
t1.add([3,func3])
time.sleep(0.5)
t1.add([2,func4])
time.sleep(0.5)
t1.add([1,func5])
time.sleep(5)
t1.add([1,func1])
t1.add([2,func2])
t1.add([3,func3])
t1.add([4,func4])
t1.add([5,func5])
# 输出
# 2
# 07/27/2017 10:36:47 [Thursday] start
# add [5, <function func1 at 0x000000D79FC77E18>]
# add [4, <function func2 at 0x000000D79FCA8488>]
# 3
# add [3, <function func3 at 0x000000D79FCA8510>]
# add [2, <function func4 at 0x000000D79FCA8598>]
# 3
# add [1, <function func5 at 0x000000D79FCA8620>]
# 3
# 07/27/2017 10:36:50 [Thursday] func5 1
# 07/27/2017 10:36:51 [Thursday] func4 0.498349666595459
# 3
# 07/27/2017 10:36:51 [Thursday] func3 0.49782633781433105
# 07/27/2017 10:36:52 [Thursday] func2 0.49848270416259766
# 3
# 07/27/2017 10:36:52 [Thursday] func1 0.48449039459228516
# 2
# 2
# add [1, <function func1 at 0x000000D79FC77E18>]
# add [2, <function func2 at 0x000000D79FCA8488>]
# add [3, <function func3 at 0x000000D79FCA8510>]
# add [4, <function func4 at 0x000000D79FCA8598>]
# add [5, <function func5 at 0x000000D79FCA8620>]
# 3
# 07/27/2017 10:36:55 [Thursday] func1 0.9990766048431396
# 3
# 07/27/2017 10:36:56 [Thursday] func2 0.9988017082214355
# 3
# 07/27/2017 10:36:57 [Thursday] func3 0.99928879737854
# 07/27/2017 10:36:58 [Thursday] func4 0.9991350173950195
# 3
# 3
# 07/27/2017 10:36:59 [Thursday] func5 0.9988160133361816
import time import threading import logging class NewTimer(threading.Thread): '''单线程下的定时器''' def __init__(self): super().__init__() self.queues = [] self.timer = None self.cond = threading.Condition() def run(self): while True: # print('NewTimer',self.queues) self.cond.acquire() item = self.get() callback = None if not item: logging.info('NewTimer wait') self.cond.wait() elif item[0] <= time.time(): new_item = self.pop() callback = new_item[1] else: logging.info('NewTimer start sys timer and wait') self.timer = threading.Timer(item[0]-time.time(),self.execute) self.timer.start() self.cond.wait() self.cond.release() if callback: callback(item[0]) def add(self, item): # print('add', item) self.cond.acquire() item[0] = item[0] + time.time() self.queues.append(item) self.queues.sort(key=lambda x: x[0]) logging.info('NewTimer add notify') if self.timer: self.timer.cancel() self.timer = None self.cond.notify() self.cond.release() def pop(self): item = None if len(self.queues) > 0: item = self.queues.pop(0) return item def get(self): item = None if len(self.queues) > 0: item = self.queues[0] return item def execute(self): logging.info('NewTimer execute notify') self.cond.acquire() self.cond.notify() self.cond.release()出力
注: 今回は何があってもテスト スレッドの数は継続的に増加することはなく、マルチタイマー タスクの要件は同時に達成できます。 欠点: 2 つのスレッドが使用されます。 2 回目の精度の問題では、プログラムの実行を続行するには、最後にスケジュールされたプログラムの実行が完了するまで待つ必要があります
。以上がPython 開発における単一スレッドで実行される複数のスケジュールされたタスクの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Pythonの柔軟性は、マルチパラダイムサポートと動的タイプシステムに反映されていますが、使いやすさはシンプルな構文とリッチ標準ライブラリに由来しています。 1。柔軟性:オブジェクト指向、機能的および手続き的プログラミングをサポートし、動的タイプシステムは開発効率を向上させます。 2。使いやすさ:文法は自然言語に近く、標準的なライブラリは幅広い機能をカバーし、開発プロセスを簡素化します。

Pythonは、初心者から上級開発者までのすべてのニーズに適した、そのシンプルさとパワーに非常に好まれています。その汎用性は、次のことに反映されています。1)学習と使用が簡単、シンプルな構文。 2)Numpy、Pandasなどの豊富なライブラリとフレームワーク。 3)さまざまなオペレーティングシステムで実行できるクロスプラットフォームサポート。 4)作業効率を向上させるためのスクリプトおよび自動化タスクに適しています。

はい、1日2時間でPythonを学びます。 1.合理的な学習計画を作成します。2。適切な学習リソースを選択します。3。実践を通じて学んだ知識を統合します。これらの手順は、短時間でPythonをマスターするのに役立ちます。

Pythonは迅速な開発とデータ処理に適していますが、Cは高性能および基礎となる制御に適しています。 1)Pythonは、簡潔な構文を備えた使いやすく、データサイエンスやWeb開発に適しています。 2)Cは高性能で正確な制御を持ち、ゲームやシステムのプログラミングでよく使用されます。

Pythonを学ぶのに必要な時間は、人によって異なり、主に以前のプログラミングの経験、学習の動機付け、学習リソースと方法、学習リズムの影響を受けます。現実的な学習目標を設定し、実用的なプロジェクトを通じて最善を尽くします。

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ドリームウィーバー CS6
ビジュアル Web 開発ツール
