python-ネットワークセキュリティプログラミング第五日目(スレッドマルチスレッド・モジュール・キュー・モジュール)

序文

昨日夜9時スリープ以上2ポイントアップし、スリープしませんでした。そして、それはemmmm学び、アイドル日間のpythonのコースを拾いました。新しいコンテンツを学習を開始していき5.58まとめたもので、今で学びます

スレッドたくさんの?

スレッド(英語:スレッド)が動作可能なオペレーティング・システムでのスケジューリングの最小単位。それに含まれるのプロセスであり、それは処理ユニットの実際の動作を制御します。スレッドが参照するプロセス制御の単一の一連の流れにおいて、プロセスの複数のスレッドが同時に、並行して各スレッドは、異なるタスクを実行します。UnixのシステムVとでのSunOSまた、軽量プロセス(軽量プロセス)と呼ばれているが、より軽量プロセスは、スレッドと呼ばれるユーザスレッド(ユーザスレッド)が、カーネルスレッド(カーネルスレッド)を指します。

プロセス(プロセス)は、システムの活動に関するデータの集合で実行するコンピュータプログラムは、リソース割り当ておよびスケジューリングの基本単位である基礎となるオペレーティング・システム・アーキテクチャです。設計プロセスの初期段階のためのコンピュータ・アーキテクチャでは、基本的なプロセスは、プログラムの実体の実行で、スレッドのための現代のコンピュータアーキテクチャの設計では、スレッドが処理容器です。プログラム命令、データの編成であり、プロセスのその説明は固体プログラムです。

複数の異なるプログラムの同時実行に似たマルチスレッド、マルチスレッド実行は次のような利点があります。

  • プログラムが使用するスレッドがに対処するためのバックグラウンドに長いタスクを占めることができます。
  • ユーザーインターフェースは、ユーザーが特定のイベントの処理をトリガーするボタンをクリックするたとえば、あなたがプロセスの進行状況を表示するプログレスバーをポップアップ表示することができ、より魅力的にすることができます
  • スピードを実行すると加速する可能性
  • そのような達成するためにユーザーの入力を待っているなど、いくつかのタスクでは、文書リテラシーとネットワークデータを送受信し、スレッドがより有用です。このケースでは、メモリ使用量などのいくつかの貴重なリソースを解放し、上のようにすることができます。
  • スレッドを先取りすることができます(中断)
  • 実行している他のスレッドにおいて、スレッドは、(また、睡眠としても知られる)一時停止状態に保持することができる - これは、スレッドの譲歩です。

Pythonのマルチスレッド - スレッドモジュールの導入

モジュールスレッドのスレッドに関連する動作を提供するために、スレッドは、業務アプリケーションの最小単位です。pythonのマルチスレッドライブラリの現在のバージョンは、優先度、スレッドグループを実装していない、スレッドが中断、停止、一時停止、再開することはできません。

threadingモジュールはクラスを提供します:  
  スレッド、ロック、Rロック、条件条件のため、[有界]セマフォ、イベント、タイマー、ローカル

輸入スレッド

 

スレッディングモジュール

Pythonは2つの標準ライブラリのスレッドとスレッド通すためのサポートを提供します。スレッドは、低レベル、元のスレッドと単純ロックを提供します。

他の方法スレッドモジュールが用意されています。

  • threading.currentThread():現在のスレッドの変数を返します。
  • threading.enumerateは():実行中のスレッドのリストを返します。実行中のスレッドが開始を意味し、終了する前に、開始前と終了後に糸が含まれていません。
  • threading.activeCountは():実行中のスレッドの数を返します、とlen(threading.enumerate())と同じ結果を持っています。

方法を使用することに加えて、スレッドモジュールは、Threadクラスは、次のメソッドを提供し、スレッドを処理するスレッドクラスを提供します。

  • 実行():  アクティブなスレッドの方法を示すために。
  • 開始():スレッドの活動を開始。
  • ([時間])参加:  スレッドが中断されるまで待ち。このブロックは、スレッドのjoin()メソッドを呼び出すまでのスレッドがサスペンションと呼ばれている-通常の終了または未処理の例外を投げる-またはオプションのタイムアウトが発生します。
  • isAlive():  戻り値のスレッドがアクティブです。
  • getName():  スレッド名を返します。
  • setName():  スレッド名を設定します。

マルチスレッディングPythonは - ()threading.Thread介してスレッドを作成します

  • (は)threading.Thread介してスレッドを作成します。ターゲットは、関数名を実行するために受信される場合、引数は、関数に渡されたパラメータを受け取ります
  • 例えば:
  • インポートスレッディング
     インポート時間
    
    DEF xiaohua(N-):
         印刷" xiaohua:%S ")(N)を
        time.sleep( 2) 遅延効果を増大させるが見られる
    
    #は二つのスレッド作成し 
    、T1 = threading.Thread(目標= xiaohuaを、引数=(2 ))
    T2 = threading.Threadの(目標= xiaohua、引数=(3 )) 
    
    二つのスレッドの開始
    t1.startを()
    t2.start()
  • プログラムは、上から下にメインスレッドを実行した後に、t1において、2つのスレッド・開始後t2は、メインスレッドと並行して、CPUリソースをつかみます。私たちは、最初の2行が同時に結果を印刷して、我々は、マルチスレッドを使用しているこの時点では2秒を待たなければならすぐに第二の印刷を印刷する私たちの通常の空の関数xiaohuaを実行するために、遅延の2秒の下で内部xiaohua機能を増加させました。

python-キューモジュール

Pythonのキューモジュールは、FIFO(先入れ先出し)キューキュー、LIFO(最後に、最初のアウト)キューLifoQueue、およびプライオリティキュー優先度つきキューを含む、同期キューベースのスレッドセーフを提供します。これらのキューは、ロッキング・プリミティブは、複数のスレッドに直接使用することができる実現されます。あなたは、スレッド間の同期を達成するためにキューを使用することができます。

  • Queue.qsize()キューのサイズを返します。
  • Queue.empty(キューが空の場合)、Trueを返し、偽逆に
  • Queue.full()キューがいっぱいの場合は、TrueまたはFalseとその逆を返します
  • サイズおよびMAXSIZEに対応Queue.full
  • Queue.get([ブロック[タイムアウト]])買収キュー、タイムアウト待ち時間
  • Queue.get_nowait()相当Queue.get(偽)
  • Queue.put(アイテム)書き込みキュー、タイムアウト待ち時間
  • Queue.put_nowait(アイテム)相当Queue.put(アイテム、偽)
  • Queue.task_doneは()ジョブの完了後に、タスクに信号を送信するためにQueue.task_done()関数は、キューが完了しています
  • Queue.joinは()実際にキューが空になるまで、その後、他の操作を行うこと

キューキューモジュール-FIFO

クラスQueue.Queue(MAXSIZE = 0)

まずアウト、FIFOの最初であるFIFO。待ち行列FIFOは、基本的な容器を提供し、使用が簡単であり、MAXSIZEは、データキューに格納することができる上限の数を示す整数です。あなたが上限に達すると、挿入はキューが消費されているデータまでブロックにつながることができます。もしMAXSIZE未満または0に等しい、キューのサイズが限定されるものではありません。

import queue
Queue=queue.Queue()

for i in range(6):
    Queue.put(i)
    
while not Queue.empty():
    print(Queue.get()) 

 

执行结果

Queue模块-LIFO队列

class Queue.LifoQueue(maxsize=0)

LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上

import queue
Queue=queue.LifoQueue()

for i in range(6):
    Queue.put(i)
    
while not Queue.empty():
    print(Queue.get()) 

 

执行结果:

 

综合运用

# coding=utf-8
import threading, queue, time, urllib
from  urllib import request
baseUrl = 'http://www.pythontab.com/html/pythonjichu/'
urlQueue = queue.Queue()

for i in range(2,10):
    url=baseUrl+str(i)+'.html'
    urlQueue.put(url)
    print(url)

def fetchUrl(urlQueue):
    while True:
        try:
            url=urlQueue.get_nowait()#相当queue.get(False)
            i=urlQueue.qsize()#返回队列的大小
        except Exception as e:
                break
        print('当前线程名%s,url:%s'%(threading.currentThread().name,url));
        try:
            response=urllib.request.urlopen(url)
            responseCode=response.getcode()
        except Exception as e:
            continue
        if responseCode==200:
             #抓取内容的数据处理可以放到这里
#            #为了突出效果, 设置延时
            time.sleep(1)


if __name__=='__main__':
    startTime=time.time()
    threads=[]
    threadNum=4
    
    for i in range(0,threadNum):
        t=threading.Thread(target=fetchUrl,args=(urlQueue,))
        threads.append(t) #将线程加入到容器
        print(threads)
    
    for t in threads:
        t.start()
    for t in threads:
        t.join()
       
    endTime=time.time()
    print('time=%s'%(endTime-startTime))

 参考学习:https://www.cnblogs.com/tkqasn/p/5700281.html

https://www.runoob.com/python/python-multithreading.html

https://www.cnblogs.com/itogo/p/5635629.html

おすすめ

転載: www.cnblogs.com/xhds/p/12220513.html