Получение возвращаемого значения из многопоточности в python 3 - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь получить одно или несколько возвращаемых значений из потока в многопоточном процессе. Код, который я показываю, зацикливается без возможности его прервать с помощью Ctrl- C, Ctrl + D.

import queue as Queue
import threading

class myThread (threading.Thread):
   def __init__(self, threadID, name, region):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.region = region
   def run(self):
      GetSales(self.region)

def GetSales(strReg): 
    print("Thread-" + strReg)
    return "Returning-" + strReg

def Main():

    RegionList = []
    RegionList.append("EMEA")
    RegionList.append("AP")
    RegionList.append("AM")

    # Create threads
    threads = []
    x = 0
    for region in RegionList:
        x += 1
        rthread = myThread(x, "Thread-" + region, region)   # Create new thread
        rthread.start()                                     # Start new thread
        threads.append(rthread)                             # Add new thread to threads list



    que = Queue.Queue()

    # Wait for all threads to complete
    for t in threads:
        t.join()
        result = que.get()
        print(t.name + " -> Done")

Main()

Если я прокомментирую строку "result = que.get ()", программа будет работать без проблемы.

1 Ответ

0 голосов
/ 29 мая 2020

То, что вы ищете, это будущее и асинхронное c управление.

Во-первых, ваша программа l oop на неопределенный срок из-за строки que.get(), потому что в очереди ничего нет, она ждет что-то случится, чего никогда не случится. Вы не используете его.


То, что вы хотите сделать, это асинхронная c задача и получить результат:

import asyncio

async def yourExpensiveTask():
    // some long calculation
    return 42

async main():
    tasks = []
    tasks += [asyncio.create_task(yourExpensiveTask())]
    tasks += [asyncio.create_task(yourExpensiveTask())]

    for task in tasks:
        result = await task
        print(result)

См. Также https://docs.python.org/3/library/asyncio-task.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...