ホームページ >バックエンド開発 >Python チュートリアル >Python によって開発された 3 つの動作モードの詳細な紹介
この記事では主にPython開発の3つの動作モードに関する関連情報を詳しく紹介しますので、必要な方は参考にしてください
Pythonの3つの動作モード
Pythonはスクリプト言語として、幅広い機能を備えています。を使用します。アルゴリズムを開発するためにそれを使用する学生もいれば、ロジックを検証するためにそれを使用する学生もいますし、システム プロセス全体をバインドする接着言語としてそれを使用する学生もいます。いずれの場合も、Python の使用方法は、独自のビジネス シナリオと独自の Python アプリケーション機能の両方によって異なります。個人的には、Pythonは事業開発にもプロダクトプロトタイプ開発にも使えると考えています。 一般的にPythonは主に以下の3つのモードで動作します。
1. シングルループモード
シングルループモードは最もよく使用され、最もシンプルで、そしてもちろん最も安定しています。その理由は、1 つのループで記述されるコードが少なくなり、エラーが発生する可能性が少なくなるためです。そのため、インターフェイスが正しく記述されている限り、エラーが発生する可能性は通常非常に低いからです。もちろん、単一のループが役に立たないと言っているのではなく、まったく逆です。シングル ループ モードは、最も頻繁に使用するモードです。この種の開発は、一部のガジェット、小規模なアプリケーション、小規模なシーンに特に適しています。
#!/usr/bin/python import os import sys import re import signal import time g_exit = 0 def sig_process(sig, frame): global g_exit g_exit = 1 print 'catch signal' def main(): global g_exit signal.signal(signal.SIGINT, sig_process) while 0 == g_exit: time.sleep(1) ''' module process code ''' if __name__ == '__main__': main()
2. マルチスレッドモード
マルチスレッドモードは、ブロックされやすい状況でよく使用されます。たとえば、マルチスレッド クライアントの読み取りと書き込み、マルチスレッド Web アクセスなどです。ここでのマルチスレッドの特徴の 1 つは、クライアントに応じて各スレッドが作成されることです。簡単な例はサーバー ソケットです。ソケットを使用してスレッドを作成すると、複数のユーザーがいる場合に複数のスレッドが同時に接続されます。この方法は比較的シンプルですぐに使用できますが、欠点は、すべてのビジネスが同時に実行される可能性があり、グローバルなデータ保護が非常に面倒なことです。
#!/usr/bin/python import os import sys import re import signal import time import threading g_exit=0 def run_thread(): global g_exit while 0 == g_exit: time.sleep(1) ''' do jobs per thread ''' def sig_process(sig, frame): global g_exit g_exit = 1 def main(): global g_exit signal.signal(signal.SIGINT, sig_process) g_threads = [] for i in range(4): td = threading.Thread(target = run_thread) td.start() g_threads.append(td) while 0 == g_exit: time.sleep(1) for i in range(4): g_threads[i].join() if __name__ == '__main__': main()
3.reactorモード
リアクターモードは簡単に言うと、マルチスレッドを使って各業務を処理します。ビジネスがスレッドによって処理された場合、他のスレッドはそのビジネスを再度処理することはできません。このように、これは問題を解決することと同じであり、前述したロックの問題です。したがって、このモデルの開発者にとって、執筆業は実際には単純な問題です。なぜなら、集中しなければならないのは自分の 1 エーカーの 3 分の 1 の土地だけだからです。以前 Yunfeng が書いた Skynet もそのようなモデルでしたが、C+lua を使用して開発されました。実際、reactor パターン自体を理解していれば、開発にどの言語を使用するかは問題ではありません。重要なのは、reactor の本質を理解することです。
コードで書くと、次のようになります。
#!/usr/bin/python import os import sys import re import time import signal import threading g_num = 4 g_exit =0 g_threads = [] g_sem = [] g_lock = threading.Lock() g_event = {} def add_event(name, data): global g_lock global g_event if '' == name: return g_lock.acquire() if name in g_event: g_event[name].append(data) g_lock.release() return g_event[name] = [] ''' 0 means idle, 1 means busy ''' g_event[name].append(0) g_event[name].append(data) g_lock.release() def get_event(name): global g_lock global g_event g_lock.acquire() if '' != name: if [] != g_event[name]: if 1 != len(g_event[name]): data = g_event[name][1] del g_event[name][1] g_lock.release() return name, data else: g_event[name][0] = 0 for k in g_event: if 1 == len(g_event[k]): continue if 1 == g_event[k][0]: continue g_event[k][0] =1 data = g_event[k][1] del g_event[k][1] g_lock.release() return k, data g_lock.release() return '', -1 def sig_process(sig, frame): global g_exit g_exit =1 print 'catch signal' def run_thread(num): global g_exit global g_sem global g_lock name = '' data = -1 while 0 == g_exit: g_sem[num].acquire() while True: name, data = get_event(name) if '' == name: break g_lock.acquire() print name, data g_lock.release() def test_thread(): global g_exit while 0 == g_exit: for i in range(100): add_event('1', (i << 2) + 0) add_event('2', (i << 2) + 1) add_event('3', (i << 2) + 2) add_event('4', (i << 2) + 3) time.sleep(1) def main(): global g_exit global g_num global g_threads global g_sem signal.signal(signal.SIGINT, sig_process) for i in range(g_num): sem = threading.Semaphore(0) g_sem.append(sem) td = threading.Thread(target=run_thread, args=(i,)) td.start() g_threads.append(td) ''' test thread to give data ''' test = threading.Thread(target=test_thread) test.start() while 0 == g_exit: for i in range(g_num): g_sem[i].release() time.sleep(1) ''' call all thread to close ''' for i in range(g_num): g_sem[i].release() for i in range(g_num): g_threads[i].join() test.join() print 'exit now' ''' entry ''' if __name__ == '__main__': main()
読んでいただきありがとうございます。皆さんのお役に立てれば幸いです。このサイトのサポートに感謝します。
Python によって開発された 3 つの動作モードの詳細な紹介と関連記事については、PHP 中国語 Web サイトに注目してください。