我有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)
这是可行的,但是随后我一个接一个地运行脚本实例,而不是同时运行。
有人知道如何处理吗? :)
答案 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个线程。 一般来说,一次运行的线程数是否有限制?