1

Python とmodbus_tk パッケージを使用して PLC をポーリングしていますn。各ポーリングには約 5 秒かかります。n*5すべてのデータを取り戻すのに数秒かからないように、これらを並行して実行することは可能ですか?

私の現在のコード:

for ip in ip_addresses:
    master = modbus_tcp.TcpMaster(host=ip_address)
    my_vals = (master.execute(1, cst.READ_HOLDING_REGISTERS, starting_address=15))
    return my_vals
4

2 に答える 2

1

modbus_tk の知識がありませんが、スレッド ライブラリだけを使用できますか? ポーリングする IP アドレスごとに 1 つのスレッドを作成します。

以下に、すぐに使用できるサンプル コードを示します。

import threading

class Poller( threading.Thread ):
    def __init__( self, ipaddress ):
        self.ipaddress = ipaddress
        self.my_vals = None
        threading.Thread.__init__(self)

    def run( self ):
        master = modbus_tcp.TcpMaster(host=self.ipaddress)
        self.my_vals = (master.execute(1, cst.READ_HOLDING_REGISTERS, starting_address=15))


pollers = []
for ip in ip_addresses:
    thread = Poller(ip)
    pollers.append(thread)
    thread.start()

# wait for all threads to finish, and collect your values
retrieved_vals = []
for thread in pollers:
    thread.join()
    retrieved_vals.append(thread.my_vals)

# retrieved_vals now contains all of your poll results
for val in retrieved_vals:
    print val

マルチプロセッシングはここでも機能しますが、この問題にはやり過ぎです。これは I/O 操作であるため、スレッド化の理想的な候補です。GIL (グローバル インタープリター ロック) によって速度が低下することはありません。また、スレッドはプロセスよりも軽量です。

于 2014-06-06T22:51:16.013 に答える
0

multiprocessing.imap_unorderedを使用します。プロセスのプールを開始し、ジョブをプールに送信し、ジョブが入ってきたときに結果を受け取ることができます。

一連の URL をダウンロードするサンプル コードを次に示します。

import multiprocessing, re, subprocess, sys

CMD_LIST = [
    ["wget", "-qO-", "http://ipecho.net/plain"],
    ["curl", '-s', "http://www.networksecuritytoolkit.org/nst/cgi-bin/ip.cgi"],
    ["curl", '-s', "v4.ident.me"],
    ["curl", '-s', "ipv4.icanhazip.com"],
    ["curl", '-s', "ipv4.ipogre.com"],
]


ip_pat = re.compile('[0-9.]{7,}')
pool = multiprocessing.Pool(5)
for output in pool.imap_unordered(subprocess.check_output, CMD_LIST):
    print 'output:',output
    m = ip_pat.search(output)
    if m:
        print 'GOT IP:', m.group(0)
        pool.terminate()
        sys.exit(0)

print 'no IP found'
于 2014-06-06T22:49:17.177 に答える