ちゃんとカテゴリ分けされておりませんので、
記事をお探しならブログ内検索が便利です。
ご活用くださいませー+.(≧∀≦)゚+.゚
ブログ内検索
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
カテゴリー
最新コメント
[11/22 รูปพวงหรีดแสดงความเสียใจ]
[11/22 ดอกไม้ งานศพ]
[11/22 ช่อดอกไม้ตามสั่ง]
[11/22 ร้านดอกไม้บรรยากาศอบอุ่น]
[11/21 Robertret]
最新記事
(08/22)
(02/19)
(01/16)
(12/29)
(12/28)
最新トラックバック
プロフィール
+ハンドル+
y_ayamori(purple)
+職業+
IT系エンジニア
+すまい+
さいたま
y_ayamori(purple)
+職業+
IT系エンジニア
+すまい+
さいたま
多くのデータを分散処理したいことが多々あります。
並列化は一筋縄でいかないことはシステムを組んでみようと考えたことがある人なら難易度は低くないことは容易に想像がつくと思います。
特に処理をプロセス間で重複させないためのシリアライズは手を焼く仕組みの一つです。
この話をメンバに相談すると必ずキューイングがやり玉にあがるのです。
そうキューイング信者が社内にいるのです…
何かとキューキュー騒ぐので、何もたいそれたシステムを導入しなくても実現できるんじゃない?
と思いまして、調べたところ、DBで簡単に実現できそうでした♪
参考:
https://lightgauge.net/database/sqlserver/962/
まず、キューとなるテーブルを作成します。
次に、テスト用にキューを貯めていきましょう。
キューを払い出しつつ、キューを削除していきます。
ターミナルをいくつか立ち上げて、下記コマンドを投げまくってみます。
結果を確認します。
うまくシリアライズされていました。
行ロックを取得しない版も投げてみます。
処理がシリアライズできていないので二重処理してしまい、後から処理したものは削除ができず、0件になっています。
これでPythonのQueueクラスのようなキューイングシステムができました。
小~中規模程度にしか通用しなさそうですが、やれ、ミドルウェアが必要だの、
OSのバージョンアップが必要だの、大げさな話になるくらいならこれくらいライトに初めてもいいのではないでしょうか^^
並列化は一筋縄でいかないことはシステムを組んでみようと考えたことがある人なら難易度は低くないことは容易に想像がつくと思います。
特に処理をプロセス間で重複させないためのシリアライズは手を焼く仕組みの一つです。
この話をメンバに相談すると必ずキューイングがやり玉にあがるのです。
そうキューイング信者が社内にいるのです…
何かとキューキュー騒ぐので、何もたいそれたシステムを導入しなくても実現できるんじゃない?
と思いまして、調べたところ、DBで簡単に実現できそうでした♪
参考:
https://lightgauge.net/database/sqlserver/962/
まず、キューとなるテーブルを作成します。
psql DROP TABLE mq ; CREATE TABLE mq ( id serial, message text, primary key(id) ); \q
次に、テスト用にキューを貯めていきましょう。
for i in $(seq 1000) do value='' for i in $(seq 10) do value="$value ,('hoge')" done psql -c "INSERT INTO mq(message) VALUES('hoge') $value " done
キューを払い出しつつ、キューを削除していきます。
DELETE FROM mq WHERE id = (SELECT id FROM mq WHERE pg_try_advisory_lock(tableoid::int, id) LIMIT 1) returning *;
ターミナルをいくつか立ち上げて、下記コマンドを投げまくってみます。
\rm /tmp/hoge for i in $(seq 600) do psql -c"DELETE FROM mq WHERE id = (SELECT id FROM mq WHERE pg_try_advisory_lock(tableoid::int, id) LIMIT 1) returning 'hoge', *;" >> /tmp/hoge done
結果を確認します。
うまくシリアライズされていました。
grep DELETE hoge | sort | uniq -dc 1189 DELETE 1
行ロックを取得しない版も投げてみます。
\rm /tmp/hoge for i in $(seq 600) do psql -c"DELETE FROM mq WHERE id = (SELECT id FROM mq LIMIT 1) RETURNING 'hoge', *;" >> /tmp/hoge done
処理がシリアライズできていないので二重処理してしまい、後から処理したものは削除ができず、0件になっています。
grep DELETE hoge | sort | uniq -dc 37 DELETE 0 1138 DELETE 1
これでPythonのQueueクラスのようなキューイングシステムができました。
小~中規模程度にしか通用しなさそうですが、やれ、ミドルウェアが必要だの、
OSのバージョンアップが必要だの、大げさな話になるくらいならこれくらいライトに初めてもいいのではないでしょうか^^
PR
この記事にコメントする