這可能是一個非常基本的問題,我可以想到解決方案,但我想知道是否有一個我不知道的更優雅的問題(快速谷歌搜索并沒有帶來任何有用的東西)。
我撰寫了一個腳本來與遠程設備通信。但是,既然我有不止一種這種型別,我想我只是在并發期貨中進行通信并同時處理它:
with concurrent.futures.ThreadPoolExecutor(20) as executor:
executor.map(device_ctl, ids, repeat(args))
所以它最多只呼叫 20 個具有各自 ID 和相同引數的 device_ctl 執行緒。device_ctl 現在正在列印一些結果,但由于它們都是并行運行的,所以它會混淆并且看起來很亂。理想情況下,每個 ID 可以有 1 行顯示通信的當前狀態,并在更改后更新,例如:
Dev1 Connecting...
Dev2 Connected! Status: Idle
Dev3 Connected! Status: Updating
但是,我真的不知道如何很好地解決它。我可以想到一個狀態串列,它在執行緒之外被組裝成一個狀態字串,該字串經常更新。但感覺可能有更簡單的方法!想法?
uj5u.com熱心網友回復:
由于沒有好的答案,我自己做了一個解決方案,它非常緊湊但高效。我定義了一個全域呼叫的類。每個執行緒都會根據其 ID 填充它或更新一個值。該 ID 與執行緒所采用的串列條目相同。這里我做了一個簡單的例子如何使用它:
class collect:
ids = []
outs = []
LINE_UP = "\033[1A"
LINE_CLEAR = "\x1b[2K"
printed = 0
def init(list):
collect.ids = [i for i in list]
collect.outs = ["" for i in list]
collect.printall()
def write(id, out):
if id not in collect.ids:
collect.ids.append(id)
collect.outs.append(out)
else:
collect.outs[collect.ids.index(id)] = out
def writeout(id, out):
if id not in collect.ids:
collect.ids.append(str(id))
collect.outs.append(str(out))
else:
collect.outs[collect.ids.index(id)] = str(out)
collect.printall()
def append(id, out):
if id not in collect.ids:
collect.ids.append(str(id))
collect.outs.append(str(out))
else:
collect.outs[collect.ids.index(id)] = str(out)
def appendout(id, out):
if id not in collect.ids:
collect.ids.append(id)
collect.outs.append(out)
else:
collect.outs[collect.ids.index(id)] = str(out)
collect.printall()
def read(id):
return collect.outs[collect.ids.index(str(id))]
def readall():
return collect.outs, "\n".join(collect.outs)
def printall(filter=""):
if collect.printed > 0:
print(collect.LINE_CLEAR collect.LINE_UP * len(collect.ids), end="")
print(
"\n".join(
[
collect.ids[i] "\t" collect.outs[i] " " * 30
for i in range(len(collect.outs))
if filter in collect.ids[i]
]
)
)
collect.printed = len(collect.ids)
def device_ctl(id,args):
collect.writeout(id,"Connecting...")
if args.connected:
collect.writeout(id,"Connected")
collect.init(ids)
with concurrent.futures.ThreadPoolExecutor(20) as executor:
executor.map(device_ctl, ids, repeat(args))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/520158.html
標籤:Python壳并发期货
