如何解决如何在协程中从pymodbus.client.asynchronous.tcp使用AsyncModbusTCPClient?
基于PyModbus的“异步Asyncio客户端示例”,我尝试在协程中初始化客户端。 run_with_already_running_loop()中的示例运行良好,但是在协程 async_read()中运行时,初始化ModbusClient挂起时没有超时或错误消息。
#!/usr/bin/env python
import asyncio
import logging
from pymodbus.client.asynchronous.tcp import AsyncModbusTCPClient as ModbusClient
from pymodbus.client.asynchronous import schedulers
from threading import Thread
import time
# --------------------------------------------------------------------------- #
# configure the client logging
# --------------------------------------------------------------------------- #
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
UNIT = 0x01
TCP_IP = '192.168.0.168'
ADDRESS = 40035
COUNTS = 16
async def start_async_test(client):
rr = await client.read_holding_registers(ADDRESS,COUNTS,unit=UNIT)
print(rr.registers)
def run_with_already_running_loop():
"""
An already running loop is passed to ModbusClient Factory
:return:
"""
log.debug("Running Async client with asyncio loop already started")
log.debug("------------------------------------------------------")
def done(future):
log.info("future: Done !!!")
def start_loop(loop):
"""
Start Loop
:param loop:
:return:
"""
asyncio.set_event_loop(loop)
loop.run_forever()
loop = asyncio.new_event_loop()
t = Thread(target=start_loop,args=[loop])
t.daemon = True
# Start the loop
t.start()
assert loop.is_running()
loop,client = ModbusClient(schedulers.ASYNC_IO,host=TCP_IP,loop=loop)
future = asyncio.run_coroutine_threadsafe(
start_async_test(client.protocol),loop=loop)
future.add_done_callback(done)
while not future.done():
print('sleep')
time.sleep(0.2)
loop.stop()
log.debug("--------DONE RUN_WITH_ALREADY_RUNNING_LOOP-------------")
async def async_read():
"""
An already running loop is passed to ModbusClient Factory
:return:
"""
log.debug("Running Async client in async function")
log.debug("------------------------------------------------------")
loop = asyncio.get_running_loop()
assert loop.is_running()
# python hangs when initialising client
loop,loop=loop)
future = asyncio.run_coroutine_threadsafe(
start_async_test(client.protocol),loop=loop)
log.debug("------- DONE IN ASYNC FUNCTION -------------")
log.debug("")
if __name__ == '__main__':
log.debug(
"------------------- Run with already running loop -------------------")
run_with_already_running_loop()
print('new test'.center(90,'-'))
asyncio.run(async_read())
工作同步代码为
from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient(TCP_IP)
client.connect()
client.read_holding_registers(ADDRESS,count=COUNT)
有什么想法如何使用asyncio提供类似的简单解决方案?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。