System.Net.WebRequest работает медленно с несколькими фоновыми работникамиC#

Место общения программистов C#
Anonymous
System.Net.WebRequest работает медленно с несколькими фоновыми работниками

Сообщение Anonymous »

У меня есть простое приложение .NET 4.7.2, которое запрашивает OpenAI через API.
Чтобы ускорить процесс, я создал в своем приложении несколько фоновых рабочих процессов, но после запуска трех скорость запросов резко падает. Это не связано с ограничением скорости или каким-то замедлением со стороны поставщика услуг, потому что когда я запускаю несколько экземпляров своего приложения и запускаю в каждом по одному фоновому воркёру, всё работает быстро. На моем компьютере установлен процессор i7 с 16 ядрами и 24 потоками.
Мои фоновые работники работают в циклах и вызывают функцию, которая выполняет запрос:

Код: Выделить всё

 Private Sub Worker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Worker1.DoWork
Dim worker As System.ComponentModel.BackgroundWorker = DirectCast(sender, System.ComponentModel.BackgroundWorker)
worker.WorkerSupportsCancellation = True
worker.WorkerReportsProgress = True

Do While worker.CancellationPending = False
...
Dim GptData = GptFn(title)

Dim NewTitle As String = GptData.Item1
Dim Lenght As Integer = Len(GptData)
Dim InputToken As Integer = GptData.Item2
Dim OutputToken As Integer = GptData.Item3
Dim Price As Double = GptData.Item4
...
Loop
End Sub
И вот эта функция:

Код: Выделить всё

Private Function GptFn(title As String) As Tuple(Of String, Integer, Integer, Double)
Try
Dim webRequest As WebRequest = WebRequest.Create(GPTEndpointURL)
webRequest.Headers("Authorization") = "Bearer " & OpenAIAPIKey
webRequest.ContentType = "application/json"
webRequest.Method = "POST"

Dim data As Byte()
webRequest.ContentType = "application/json"

data = Encoding.UTF8.GetBytes(...)

webRequest.ContentLength = data.Length

Using reader As Stream = webRequest.GetRequestStream()

reader.Write(data, 0, data.Length)
reader.Flush()
reader.Close()

Dim response As HttpWebResponse = CType(webRequest.GetResponse(), HttpWebResponse)
response = webRequest.GetResponse()
Dim sr As New StreamReader(response.GetResponseStream())
Dim json = sr.ReadToEnd
Dim Deserialize = JsonConvert.DeserializeObject(Of GPT)(json)

Dim NewTitle As String = Deserialize.Choices(0).Message.Content
Dim InputTokens As Integer = Deserialize.Usage.Prompt_tokens
Dim OutputTokens As Integer = Deserialize.Usage.Completion_tokens
Dim Price As Double = ((InputTokens / 1000000) * 0.15) + ((OutputTokens / 1000000) * 0.6)
Return Tuple.Create(NewTitle, InputTokens, OutputTokens, Price)

End Using
Catch ex As Exception
Return Tuple.Create($"Request Error: {ex.Message}", 0, 0, 0.00)
End Try

End Function
Может ли .NET 4.7.2 выполнять только один запрос за раз? Проблема определенно не связана с моим оборудованием или ограничениями API

Подробнее здесь: https://stackoverflow.com/questions/788 ... nd-workers

Вернуться в «C#»