ホームページ  >  記事  >  バックエンド開発  >  Python クローラーのスレッドとプロセスの使用 (コード付き)

Python クローラーのスレッドとプロセスの使用 (コード付き)

不言
不言転載
2018-09-28 14:31:371719ブラウズ

この記事は、Python クローラーのスレッドとプロセスの使用に関する内容 (コード付き) を提供します。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。

プロセス

使用

  • クラス ライブラリのインポート

import multiprocessing
  • クラス ライブラリのインポートprocess

p1 = multiprocessing.Process(target=test1)

プロセス パラメータ: group=None、target=None、name=None、args=()、kwargs={})

  • # グローバル変数

import time, os
import multiprocessing

nums = [11, 22, 33]
def test():
    nums.append(44)
    print('在进程1中nums=%s' % str(nums),id(nums))
    time.sleep(3)
def test2():
    print('在进程2中nums=%s' % str(nums),id(nums))
def main():
    print('----in 主进程 pid=%d----父进程pid=%d----' % (os.getpid(), os.getppid()))
    p = multiprocessing.Process(target=test)
    p.start()

    p2 = multiprocessing.Process(target=test2)
    p2.start()   
     # test()    
     # test2()
     if __name__ == '__main__':
    main()

プロセスがコピーされるため、グローバル変数はプロセス間で共有されません

Threads

Use

  • ##クラス ライブラリのインポート

  • import threading
  • スレッドの作成

  • t1 = threading.Thread(target=test1,args=(1000000,))
スレッド パラメーター: group=None、target=なし、name=None、args=()、kwargs=None、*、daemon=None

    グローバル変数
  • ##

    import time,threading
    
    g_num = 0
    mutex = threading.Lock()
    def test1(num):    
    global g_num    
    # mutex.acquire()     
        for i in range(num):
            mutex.acquire()
            g_num += 1
            mutex.release()    
            # mutex.release()
        print('-------in test1 g_num=%d-----' % g_num)
    def test2(num):    
    global g_num    
    # mutex.acquire()     
        for i in range(num):
            mutex.acquire()
            g_num += 1
            mutex.release()    
            # mutex.release()
        print('-------in test2 g_num=%d-----' % g_num)
    def main():
        t1 = threading.Thread(target=test1,args=(1000000,))
        t2 = threading.Thread(target=test2,args=(1000000,))
        t1.start()
        t2.start()
        time.sleep(3)
        print('-------------in main Thread g_num = %d----' % g_num)
     if __name__ == '__main__':
        main()
    #クリティカル セクション、のみ1 つのプログラムが同時に実行するコード ブロックに入り、通常は変更された場所を囲みます。

  • 他のスレッドが取得を呼び出すと、現在のスレッドは待機状態に入ります

threading.RLock() 再帰的ロック スレッド。条件セマフォまたは条件付きロック

プロデューサー/コンシューマー パターン

  • プロデューサー/コンシューマー パターンは、スレッド間通信のアプリケーションです

  • データ構造を使用するときにスレッド セーフであるかどうかを確認します。キュー自体はスレッド セーフです。List([]) と辞書 dic({}) はスレッド セーフではありません
def set_value(q):
    index = 0    
    while True:
        q.put(index)
        index += 1
        q.put(index)
        index += 1
        time.sleep(2)
def get_value(q):    
while True:
        print('消费者获取数据:',q.get())   #若队列为空就sleep休眠,直到队列有数据def main():
    q = Queue(4)
    t1 = threading.Thread(target=set_value,args=[q])
    t2 = threading.Thread(target=get_value,args=[q])
    t1.start()
    t2.start()

以上がPython クローラーのスレッドとプロセスの使用 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。