同时从多个线程调用.net库中的方法时,结果不完整

2024-04-28 04:38:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个GUI,它显示我们工厂中某些工具的状态。可以通过集成到.dll文件中的webservice请求状态。启动GUI应用程序时,我希望同时请求所有工具的状态。为此,我为每个工具创建一个线程,然后调用一个方法来获取工具的状态。我得到了一些正确的响应,但大约一半的线程根本不提供响应,有些线程返回错误的值

如果我一个接一个地运行请求,一切都会很好。但这需要很长时间

def request_states(self, resource, i):
    # self.driver.GetToolState is a specific method defined in a dll
    # it accesses a webservice to request data
    result = self.driver.GetToolState(str(resource), str(self.site))
    self.statedata_dic[i] = [result, state]

    if result.Success:
        print(str(resource) + result.ToolState.Description)
    else:
        print(str(resource) + 'no state av')



state_threads = []

# create a thread for every resource
for i in range(len(self.resources)):

    s_t = threading.Thread(target=self.request_states, args=[self.resources[i], i])
    # start thread
    s_t.start()

    state_threads.append(s_t)

for s_t in state_threads:
    s_t.join()

self.resources是一个包含30个条目的列表。 启动线程时似乎出现了错误

我得到的是: 1备用 2备用 3备用 残疾的 5无 6待命 7待命 8备用 9无 10备用 11待命 12无 13待命 14待命 15无州av 16待命 17待命 18待命 19待命

当一个接一个地运行线程时,我想要什么/我得到什么(没有“no state av”,所有30个线程都提供响应):

1备用 残疾的 3备用 4备用 5无 6无 7待命 8备用 9无 10备用 11待命 12待命 13待命 14待命 15待命 16待命 17待命 18待命 19待命 20备用 21待命 22待命 23待命 24待命 25待命 26待命 27待命 28富有成效 29待命 30待命


Tags: 工具inselfforrequest状态result线程
1条回答
网友
1楼 · 发布于 2024-04-28 04:38:11

您的问题很可能是由Python的GIL引起的。虽然您希望线程只会并行化您的请求,但实际上是介于两者之间的,并且是特定于Python的

根据Python's wiki,“GIL会导致I/O绑定线程的调度早于CPU绑定线程。它会阻止信号传递。”

如果仍要这样做,可以在线程内添加一个带有回退机制的重试:

import time

def request_states(self, resource, i):
    # self.driver.GetToolState is a specific method defined in a dll
    # it accesses a webservice to request data
    backoff = 3
    while backoff:
        result = self.driver.GetToolState(str(resource), str(self.site))

        if result.Success:
            backoff = 0
            self.statedata_dic[i] = [result, state]
            print(str(resource) + result.ToolState.Description)
            break
        else:
            print(str(resource) + 'no state av')
        backoff -= 1
        # increase time wait with every backoff decrement 
        # so that I increase the chances to receive a correct response
        time.sleep(0.1 * (5 - backoff))

相关问题 更多 >