並列で処理させたいなー と思うけどスレッドとか複雑そうだしよくわからない
そういうわけで単純に並列処理をする方法
思いつきで作ってみたもので効率はあまりよくないと思うので並列処理を書ける人は普通に書いたほうがいいと思います
方法は、コマンドをバックグラウンドで実行 させます
C言語だと
普通にコマンドを実行させると終了まで待って次の処理に行きますが
JavaScriptの非同期実行みたいな感じです
&をつけてバックグラウンドで実行できるのはLinuxです
Windowsだとできないです
startコマンドにしてもウィンドウが出てきてしまうので完全にバックグラウンドで実行する方法がわからないです
バックグラウンドで実行して終わり!ならいいのですが全部のバックグラウンドの実行が終わってから最後に何かしたいとか今何を実行中なのかわからないのでわかるようにします
ファイルのありなしを見ることで実行中かを判断できます
()で囲んでるのはまとめてバックグラウンドで実行するためです
複数を実行
思いつきで作ってみたもので効率はあまりよくないと思うので並列処理を書ける人は普通に書いたほうがいいと思います
方法は、コマンドをバックグラウンドで実行 させます
C言語だと
system("cp a b");これはファイルaをbにコピーするコマンドの例です
普通にコマンドを実行させると終了まで待って次の処理に行きますが
system("cp a b&");のようにしてバックグラウンド実行にするとコマンドが終了しなくても次の処理に進みます
JavaScriptの非同期実行みたいな感じです
&をつけてバックグラウンドで実行できるのはLinuxです
Windowsだとできないです
startコマンドにしてもウィンドウが出てきてしまうので完全にバックグラウンドで実行する方法がわからないです
バックグラウンドで実行して終わり!ならいいのですが全部のバックグラウンドの実行が終わってから最後に何かしたいとか今何を実行中なのかわからないのでわかるようにします
system("(touch 1;cp a b;rm 1)&");実行開始時にファイルを生成して、終了時に削除します
ファイルのありなしを見ることで実行中かを判断できます
()で囲んでるのはまとめてバックグラウンドで実行するためです
複数を実行
int i, p = 4;char cmd[32];system("mkdir work");for(i=0;i<12;i++){while(getfilecount("work")==p) sleep(1);sprintf(cmd,"touch w%d",i);system(cmd);sprintf(cmd,"(xyz; rm w%d)&",i);system(cmd);}while(getfilecount("work")>0) sleep(1);system("rm -r work");
12個の処理を4並列で行います
実行中のファイルを生成するようにworkフォルダを作成します
gefilecountは中身書いてないですが指定フォルダのファイル数を返す関数です
並列数を超えそうになるとsleepして待つようにしてます
ファイル名が被らないようにループ変数を名前にしてファイルを生成します
実行するコマンドはxyz、自分で並列で実行したいものをここに書くといいです
xyzコマンドの終了後にrmコマンドで生成したファイルを削除します
全部のコマンドをバックグラウンドで実行するように送ると、workフォルダが空になる(全部終わる)まで待って、終わったら最後にworkフォルダを消します
この方法だと、コマンドを実行してるのでマルチスレッドじゃなくてマルチプロセスになります
実行中のファイルを生成するようにworkフォルダを作成します
gefilecountは中身書いてないですが指定フォルダのファイル数を返す関数です
並列数を超えそうになるとsleepして待つようにしてます
ファイル名が被らないようにループ変数を名前にしてファイルを生成します
実行するコマンドはxyz、自分で並列で実行したいものをここに書くといいです
xyzコマンドの終了後にrmコマンドで生成したファイルを削除します
全部のコマンドをバックグラウンドで実行するように送ると、workフォルダが空になる(全部終わる)まで待って、終わったら最後にworkフォルダを消します
この方法だと、コマンドを実行してるのでマルチスレッドじゃなくてマルチプロセスになります
FirefoxじゃなくてChromeみたいなのです
どれかでエラー出ても他のは動いてるということが起きます
これがいいのか悪いのかは作るもの次第?です
どれかでエラー出ても他のは動いてるということが起きます
これがいいのか悪いのかは作るもの次第?です
コメントする