Как получить значение из функции, которая выполняется Thread? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть main_script.py, который импортирует скрипты, которые получают данные с веб-страниц. Я хочу сделать это с помощью многопоточности. Я придумал это решение, но оно не работает:

main_script:

import script1
temp_path = ''
thread1 = threading.Thread(target=script1.Main,
                             name='Script1',
                             args=(temp_path, ))

thread1.start()
thread1.join()

script1:

class Main:
    def __init__()
    def some_func()
    def some_func2()

    def __main__():
        some_func()
        some_func2()
        return callback

Теперь я знаю только один способ получить значение обратного вызова из script1 в main_script:

main_script:

import script1
temp_path = ''
# make instance of class with temp_path
inst_script1 = script1.Main(temp_path)

print("instance1:")
print(inst_script1.callback)

Это работает, но затем я запускаю экземпляры сценариев один за другим, но не одновременно.

Кто-нибудь знает, как справиться с этим? :)

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Спасибо за ответ.Да, я читал о GIL, но это не создает мне никаких проблем.Как правило, я решаю свою проблему, потому что я нахожу решение на другом сайте.Код, как сейчас:

Main_script:

import queue
import script1
import script2

queue_callbacks = queue.Queue()

threads_list = list()

temp_path1 = ''
thread1 = threading.Thread(target= lambda q, arg1: q.put(Script1.Main(arg1)),
                         name='Script1',
                         args=(queue_callbacks, temp_path1, ))
thread1.start()

temp_path2 = ''
thread2 = threading.Thread(target= lambda q, arg1: q.put(Script2.Main(arg1)),
                         name='Script2',
                         args=(queue_callbacks, temp_path2, ))
thread2.start()

for t in threads_list:
            t.join()

while not kolejka_callbacks.empty():
    result = queue_callbacks.get()
    callbacks.append({"service": result.service, "callback": result.callback, "error": result.error})

И это прекрасно работает.Теперь у меня есть другая проблема, потому что я хочу, чтобы это работало в больших масштабах, где у меня есть сотни сценариев и которые обрабатываются с помощью eq 5 потоков.В общем, есть ли ограничение на количество потоков, работающих одновременно?

0 голосов
/ 24 апреля 2019

Прежде всего, если вы используете многопоточность в Python, убедитесь, что вы прочитали: https://docs.python.org/2/glossary.html#term-global-interpreter-lock. Если вы не используете модули C или много операций ввода-вывода, вы не увидите, что скрипты запускаются одновременно. Вообще говоря, multiprocessing.pool - лучший подход.

Если вы уверены, что нам нужны потоки, а не процессы, вы можете использовать изменяемую переменную для сохранения результата. Например, словарь, который отслеживает результат каждого потока.

result = {}

def test(val, name, target):
   target[name] = val * 4 

temp_path = 'ASD'
thread1 = threading.Thread(target=test,
                             name='Script1',
                             args=(temp_path, 'A', result))

thread1.start()
thread1.join()
print (result)
...