2

私はpythonが初めてで、ここで助けを得ようとしています。ソケットを介して UDP データを送信するコードを作成しました。50 マイクロ秒ごとにループでデータを再送信したかったのですが、3 秒ごとにしか送信できません。私は何か間違ったことをしていると確信しています。助けてもらえますか? 以下のコードを貼り付けました。

import socket,codecs,binascii,re ,sched, time

UDP_IP = "XXX.XXX.XXX.XXX"

UDP_PORT = 30001
MESSAGE =  '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\
x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20'# !"#$%' #"\x00\x01\x02 "


s = sched.scheduler(time.time, time.sleep)    

def send_data(sc):

    sock = socket.socket(socket.AF_INET, # Internet

                     socket.SOCK_DGRAM) # UDP

    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))



    print""
    print""
    print""
    print""
    print""    
    sc.enter(0.000050, 1, send_data, (sc,)) 
    print time.time()
    print""
    print""

s.enter(0.0000050, 1, send_data, (s,))    
s.run()    
4

1 に答える 1

1

まず、データを送信するたびに新しいソケットを作成すると、かなりのオーバーヘッドが発生します。新しいタスクを何度もスケジュールすると、多くのオーバーヘッドも追加され、プログラムの速度がさらに低下します。特に大量のデータを出力する場合、printコマンドは少しオーバーヘッドを追加する可能性があります。

考慮すべき他の事柄には、関連するシステムタイマーの精度、ハードウェアとの相互作用、Pythonがインタープリター言語であるなどが含まれますが、それらはすべて比較するとマイナーであるため、無視できます。リアルタイムで重要なものを書きたい場合は、Cの方が適しています。

とにかく、あなたのプログラムをスピードアップするために、私は時間のかかる部分を取り除くでしょう:

import socket, time
# ...
def send_data():
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    while True: #TODO: would require an abort condition
        sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
        time.sleep(0.00005) # don't count on this to be 100% accurate

メインプログラムをブロックしたくない場合は、それをスレッドに入れることができます。

from threading import Thread
t = Thread(target=send_data)
t.start()
于 2012-11-02T17:30:33.063 に答える