pythonマルチスレッドとマルチプロセスの感想を学ぶ
2432 ワード
今日はpythonのマルチプロセスとマルチスレッドテクニックを学びました.
マルチスレッドについては何も言うことはありませんが、簡単です.マルチスレッドは一度に1つだけ実行することを制限するものではありません.スレッド間で変数を共有しないと、スレッドロックは使用できません.そう言いますが、lockプログラムを使わなくても1回に1つのスレッドしか実行しません.プログラム内部にブロック現象(ダウンロードなど)があれば、スレッドを使うのはいいですが、そうでなければ、スレッドを使わない消費の差は大きくありません(スレッドをサポートするために遅くなります).lockを使用しないのは、実際にはpythonにlockを渡し、ブロックの有無に応じてスレッドの実行を調整します.
ポイントを返して、マルチプロセスをしましょう.
次は、他の人の投稿から写したマルチプロセスモデルスクリプトです(もちろんいくつか修正されています):
しかし、私は実行しますが、フリーズしてpython解釈プログラムを開き続けます.
このプログラムはideone(オンラインコードコンパイラ)で正常に動作しているので、他の人にも正常に実行できると聞いていますが、どうして私のところに来てはいけませんか.
最初は非標準モジュールをインストールする副作用だと思ってpython 2を再インストールしました.7.3、それからネット上で別の例を探して試してみました.ok.
私はとてもうれしくて、問題を解決したと思って、しかし保険のため、やはり更に上のコードを実験して、また掛けました......
これは私を憂鬱にさせて、原因はpythonではありませんて、やはりコードの問題です.
しかしコードは正常に実行されましたね・・・
このとき、コードが格納されているディレクトリに、バイトコードのpycファイルが1つ増えていることに気づきました.
このpycファイルはこの問題と関係があるはずですが...なるほど!
pythonをインストールするときは、プリコンパイルライブラリファイルオプションを選択し、コードの実行速度を速めることができます.しかし、プリコンパイルされたバイトコードファイルのコード順序とソースコードファイルが異なるという問題が発生します.バイトコードファイルを読み込むとpycファイルの部分コード(左に貼った部分)が自動的に実行されますが、この実行によりプログラムが再帰し、python解釈を有効にしてpycファイルを実行し続けます......
そして、そして私はハングアップしました・・・
OK、それでは私の判断で修正しましょう.コードは以下の通りです.
次の文を参照してください.
の役割は,後のコードがファイルがプログラムとして実行された場合にのみ有効であり,ライブラリとしてロードされた場合には実行されないようにすることである.
結果は良く、コードの実行に成功しました.
この事例はpythonの公式のコードフォーマットが単に美しいだけでなく、できるだけ公式のスタイルで書くことで、多くの予想できない誤りを避けることができることを示しています.
マルチスレッドについては何も言うことはありませんが、簡単です.マルチスレッドは一度に1つだけ実行することを制限するものではありません.スレッド間で変数を共有しないと、スレッドロックは使用できません.そう言いますが、lockプログラムを使わなくても1回に1つのスレッドしか実行しません.プログラム内部にブロック現象(ダウンロードなど)があれば、スレッドを使うのはいいですが、そうでなければ、スレッドを使わない消費の差は大きくありません(スレッドをサポートするために遅くなります).lockを使用しないのは、実際にはpythonにlockを渡し、ブロックの有無に応じてスレッドの実行を調整します.
ポイントを返して、マルチプロセスをしましょう.
次は、他の人の投稿から写したマルチプロセスモデルスクリプトです(もちろんいくつか修正されています):
import multiprocessing
import os
def get(url,lock):
lock.acquire()
print os.getpid(),url
lock.release()
plist=[]
lock=multiprocessing.Lock()
for i in ['www.sina.com.cn','www.163.com','www.baidu.com','www.cnblogs.com','www.qq.com','www.douban.com']:
proc=multiprocessing.Process(target=get,args=(i,lock))
plist.append(proc)
for proc in plist: proc.start()
for proc in plist: proc.join()
しかし、私は実行しますが、フリーズしてpython解釈プログラムを開き続けます.
このプログラムはideone(オンラインコードコンパイラ)で正常に動作しているので、他の人にも正常に実行できると聞いていますが、どうして私のところに来てはいけませんか.
最初は非標準モジュールをインストールする副作用だと思ってpython 2を再インストールしました.7.3、それからネット上で別の例を探して試してみました.ok.
私はとてもうれしくて、問題を解決したと思って、しかし保険のため、やはり更に上のコードを実験して、また掛けました......
これは私を憂鬱にさせて、原因はpythonではありませんて、やはりコードの問題です.
しかしコードは正常に実行されましたね・・・
このとき、コードが格納されているディレクトリに、バイトコードのpycファイルが1つ増えていることに気づきました.
このpycファイルはこの問題と関係があるはずですが...なるほど!
pythonをインストールするときは、プリコンパイルライブラリファイルオプションを選択し、コードの実行速度を速めることができます.しかし、プリコンパイルされたバイトコードファイルのコード順序とソースコードファイルが異なるという問題が発生します.バイトコードファイルを読み込むとpycファイルの部分コード(左に貼った部分)が自動的に実行されますが、この実行によりプログラムが再帰し、python解釈を有効にしてpycファイルを実行し続けます......
そして、そして私はハングアップしました・・・
OK、それでは私の判断で修正しましょう.コードは以下の通りです.
from multiprocessing import Process
import os
def myget(url):
print os.getpid(),url
if __name__ == '__main__':
plist=[]
for i in ['www.sina.com.cn','www.163.com','www.baidu.com','www.cnblogs.com','www.qq.com','www.douban.com']:
proc=Process(target=myget,args=(i,))
plist.append(proc)
for proc in plist: proc.start()
for proc in plist: proc.join()
次の文を参照してください.
if
__name__
=
=
'__main__'
:
の役割は,後のコードがファイルがプログラムとして実行された場合にのみ有効であり,ライブラリとしてロードされた場合には実行されないようにすることである.
結果は良く、コードの実行に成功しました.
この事例はpythonの公式のコードフォーマットが単に美しいだけでなく、できるだけ公式のスタイルで書くことで、多くの予想できない誤りを避けることができることを示しています.