Weblogというかメモ帳

Lotus-NetWork

topimg
topimg2

今回はPythonにおけるマルチスレッドプログラミングについて。

そもそもマルチスレッドとはなにかといいますと、スレッドという処理の塊の単位を複数に分けること。たとえばCPUのコアが2つなら(デュアルコアCPU)、そのコア一つ一つに処理を割り振ったり。

まぁ並行処理させたり。

その辺はプリエンプティブマルチタスクとか、ノンプリエンプティブマルチタスクの話が絡んでくるのであれだけど。

OSが管理するのがプリエンプティブマルチタスク。アプリケーション自体がタスク、CPUを管理するのがノンプリエンプティブマルチタスク。

メリットとして、

処理の待ち時間の節約。

ネットワーク絡みの処理だとレスポンスまでに時間がかかってその間に処理をおこなう。

複数の処理を並列して行う。

など、メリットがある。リソースの有効な使い方ができる。

今回はそのマルチスレッドプログラミングをPythonで実装する。

Pythonのマルチスレッド機能は、OSのスレッド機能と密接に動くため、オーバヘッドが少ない。

Pythonにおけるマルチスレッドを行うにはthreadingモジュールのThreadクラスを継承すると簡単。他にもthreadingモジュールがある。(threadモジュールのthreadingとは別。)

threadingモジュールに定義されているThreadクラスがスーパークラスで、自分が作成するクラスはそれを継承したサブクラスになる。

このサブクラスではrun()というメソッド(関数)をオーバーライドする。

オーバーライドとはサブクラスでメソッドを再定義すること。書き換えるみたいな感じ。

__init__()メソッドも必要があるならオーバーライドする。初期化とか。

Threadの__init__()メソッドを継承しないとstart()とか使えない。

なお、run()メソッドは直接インスタンスから指定し実行うするのではなく、インスタンスからstart()メソッドを呼び出す。

そうすることで直接ではなく、間接的にrun()で定義した処理を行うことができる。直接run()を呼び出してはいけないみたい。

直接呼び出すと、プロンプトが戻らない(制御きかない。)

今回私はマルチスレッドを活かすため、ネットワークプログラミングにPythonのマルチスレッディングを使用した。

ネットワークプログラミングといっても簡単なもので、Socket通信による簡単なチャットシステム。

一つのスレッドでは処理をまっていないと(listen)いつ相手からメッセージがくるかわからない。

listenしながらも様々な処理を行うためにはどうしてもマルチスレッドを利用せざるを得ない…かも。


import socket
from threading import Thread,Lock
import thread
import sys
 
class SocketServer(Thread,object):
 
    def __init__(self):
 
        #super class init
        Thread.__init__(self)
 
        #socket settings
        self.s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.s.settimeout(1000)
        self.while_count = 0
 
        self.while_flag=True
        self.data=[]
 
         #port number options
         if "-p" in sys.argv[1:]:
            self.port = sys.argv[sys.argv.index("-p")+1]
            try :
                self.port=int(self.port)
            except :
                print "Error! Port number is integer."
                sys.exit() 
 
        #Default port number = 7777 
        else :
            self.port = 7777
 
    #Main Thread.
    def run(self):
 
        print "=" * 50
        print "Start the server program."
        print "Listening at : %s" % self.port
        print "=" * 50
        print "Pending connections..."
 
        try:
            self.s.bind(('',self.port))
            self.s.listen(10)
        except :
            print "Network error."
            print "Is the port number is already being used?"
            sys.exit()
 
        #While get recv
        while self.while_flag:
 
            self.conn,self.addr = self.s.accept()
 
            #print connect to
            if self.while_count == 0:
                print "Connected by %s " % self.addr[0]
                self.while_count=1
 
            else :
                pass
 
            try :
                self.data=self.conn.recv(1024).encode("utf-8")
                self.conn.send("OK")
 
                if self.data == "exit":
                    print "%s is closed the connection" % self.addr[0]
                    self.data="=== Withdrawal ==="
                self.conn.close()
 
            except :
                print "Failed recv."
                self.conn.close()
 
            try :
                if len(self.data) !=0:
                    print "-" * 50
                    print "%s => %s" % (self.addr[0],self.data)
                    self.conn.close()
            except :
                pass
 
            self.conn.close()
 
    #Send to argument.
    def send(self,val):
 
        try :
            self.conn.send(val+"\n")
 
        except :
            print "Error! one more please."
 
    #Thread stop method
    def stop(self):
 
        self.while_flag=False
 
        try:
            print "wait..."
            self.conn.send("Please enter a space , charcter. exsample => [bye].")
 
        except:
            print "Please enter a space , charcter or a client"
 
        self.conn.close()
        print "Connection will be closed"

上記はSocket通信を使ったスレッドの例。

これだけではあまり意味をなさないが、上記の処理をバックグラウンド、というよりスレッドとして後ろで動くので、ネットワーク特有の処置待ちをしないですむ。

このプログラムは、Socket通信をする際、サーバとなるスレッド。

未完成だが、Clientがパケットを送信してくると、サーバのプロンプトにIPアドレスと送られてきた内容を表示する、など簡単なプログラムが組んである。

今、このマルチスレッディングの技術をつかって、開発中なので、また数日し、完成したらここにアップしようかと。

lotusです、題名の通り。

Windowsの場合は調べてないですが、Linux環境でPython実行時に起動されるスクリプトを指定する方法。

PYTHONSTARTUPという環境変数にスクリプトを指定すると、動く。

export PYTHONSTARTUP=~/.pythonstartup.py

exportは昇格させるコマンド、というより

PYTHONSTARTUP=hoge

とか書いただけだとシェル変数になるので環境変数にするだけ。

ホームディレクトリの.pythonstartup.pyが起動時に実行されます。

l0utus.infro

結果的にここにリダイレクトされます。

10円だったので取得してみた。

lotusでもl0utusでも良いです。lotusだと色々ありすぎるんだよーっていうだけです、はい

twitterのidも変えたし。厨2じゃないです。

書物購入

2010/7/11 (日) 23:06:04

2 件のコメント

書物購入。

八王子のくまざわ書店で買ってきました。ちょうど学校が図書カードをくれたので、一冊は図書カード、もういっさつは自腹での購入。

一冊目(amazonのリンクですが、別にアフィとかやっていない。)

Django×Python (LLフレームワークBOOKS)

著者:露木 誠さん

Django × Python

Djangoは、以前からちょこっとやってたのですが、深く知りたかったので購入。

読みやすい。


二冊目

Hacking: 美しき策謀 ―脆弱性攻撃の理論と実際

著者:Jon Erickson

Hacking: 美しき策謀 ―脆弱性攻撃の理論と実際

オライリー本。

ちょっと古い本ですが、かなーりハイレベルな事がかいてある。。。

どのようにして脆弱性がつかれるのか・・・など。良い本。

iPhone4が発売されて数日で電波問題が浮上していることは、皆さんもう承知の事だとは思いますが、どうやら改善するようです。。

ソース

自分はてっきりハードウェアの問題で、設計上ミスがあったのでは?等と思っていたのですが、どうやら違うみたいですね。

実際のところ、この電波問題は、3G回線の電波状態が悪いわけではなく(皮肉だがいつも良いとは言えない)、電波の状態を示す表示に問題があるとのこと。

上に表示されてる電波メータ(?)ですね。ハードウェアの問題でしたら、アップデートじゃすまないのですが、ソフトウェアのバグなので、アップデートで修正可能。

どうやら、表示する際の計算式にバグがあったみたい。

この電波問題について、Appleは数週間以内に無 償のソフトウェアアップデートを提供する予定だそうだ。

この問題はiPhone 4だけでなくiOSにバージョンアップした、3Gと3GSでも障害がみられたために、こちらも対応するようだ。

あとは液晶をなんとかしてほしいものです。(笑



lotusです。

iPadは持ってないのですが、気になったので。(Apple製品は初代ipod touchしかもってないorz)

そもそもAppleはiPhoneとiPod touch(初代は除くorz)向けにiOS4を提供しました。(旧iPhoneOS、名前が変更されました。)

そのiOSでは、膨大な数の脆弱性を解決した。らしい。

Appleのセキュリティ情報によると、iOS 4で修正した脆弱性は全部で64項目で、コード実行に使われる恐れのある深 刻な脆弱性も多数を占めるそうだ。おうふ

iOS をインストールできないモデルのiPhone(初代)/iPod touch(初代)やiPad(iPadは、最近登場したからといってiOSではない)にも存在するのではないか、と指摘されている。

つまり、iOSをインストールできないモデルは・・・・。

ちなみにiPadは今、iPhoneOSを搭載していますが、iPad向けにiOS 4のアップデートが提供されるのは秋になるみたい。それまでiPadは・・・。

iPad に搭載されている OS は iPhone 3.x。

脆弱性の一部は既に修正されている可能性もあるが、現時点では危険度や、どの程度の脆弱性が残されているのかは不明。おそろしあ

それと、最近こんな事件がありましたが。

色々と大丈夫なのだろうか・・・。

まとめ

iOS4で解決された脆弱性が、これらの端末にも影響あるなら、iOSにアップデートできない端末、秋までのiPad・・・怖いですね。



Samba 3.0-3.3.12に危険度の高い脆弱性があると発表されました。

英文ですが、コチラに詳しい事が書いてあります。

スラッシュドットさんによると

この脆弱性はSMB1パケットの処理過程において適切なバリデーションを行っていなかったのが原因で、特定の細工を施したパケットをサーバーに送り込むこ とによりサーバーをクラッシュさせたり、任意のコードを実行させられる可能性があるとのこと。危険度の高い脆弱性であり、対象となるシステムを利用してい るユーザーは速やかにアップデートするべきと述べられている。

ということです。

ちなみに、。3.4系および3.5系にはこの脆弱性はないそうで、問題ないとのこと。

3.4系と3.5系ではコードが書き換えられているため、この脆弱性はうけないみたいです。

Sambaをお使いのユーザの方で、今回の脆弱性に当該するバージョンを使用している方は、今すぐアップーデートすることをオススメします。

そもそもSambaってなんぞ、という人には全く関係ないです。(笑

WordPress3.0がリリースされました。WordPress の13回目のメジャーリリースだそうです。

そしてWordPress と WordPress MU の統合され、イントール一回でひとつのサイトだけを運用することも1,000万サイトを動かすこともできることになったとか。

コチラが公式ブログ

iPhone4、ほしいですね。こ こが詳しい。

今の携帯が、使い出して二年。iPod touch(初代)8Gの容量はもう限界です。

これは前からほしかったiPhoneを買うチャンスなのでは・・・

しかし、32ギガバイトの機種が月額480円の24回払い(計1万1520円)とは安いですね。

日本のガラケーを5万円程度だして買う意味がようわかりません。

メモ。

set型使えば、重複するデータとか、しないデータを管理するのに楽(?)
重複するデータが格納できない形。
Python2.4から組み込み関数になったが、2.4以前でもsetモジュールをインポートすれば使える。
2xは、

s=set([1,2,3,4,5])

みたいな記述が可能。

3xだと

s={1,2,3,4,5}

上記の書き方も可能。
{}を使うので辞書型と被りそう?(笑

sample.

s=set([1,2,3,4,5])
s2=set([4,5,6,7,8])
 
print s & s2
45

&を使うと、共通集合を使える。
unionメソッドとはunionというくらいなので、集合和。
intersectionメソッドは&と同じで、共通集合(重複している要素)を取り出すことが可能。
addとかremoveなどのメソッドが使える
メモでした

uO