如何从Thread执行的函数中获取值?

时间:2019-04-24 07:57:36

标签: python multithreading return

我有main_script.py,该脚本可以导入从网页获取数据的脚本。我想通过使用多线程来做到这一点。我想出了这个解决方案,但是它不起作用:

main_script:

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

thread1.start()
thread1.join()

脚本1:

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 :(得分:0)

首先,如果要在Python中使用线程,请确保阅读:https://docs.python.org/2/glossary.html#term-global-interpreter-lock。除非您使用C模块或大量I / O,否则您不会看到脚本同时运行。一般来说,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)

答案 1 :(得分:0)

感谢您的回复。是的,我读过有关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})

这很好用。现在我还有另一个问题,因为我希望它可以大规模运行,在那里我有数百个脚本并可以通过e.q.处理。 5个线程。 一般来说,一次运行的线程数是否有限制?