Python:如何并行运行两个函数。
Python:如何并行运行两个函数。
这个问题已经有了答案:
这是我的程序结构:
def bunchOfFoos() ... ... def mainFoo(): #calls a bunch of functions def monitorDisconnect(): #this function should run in parallel with mainFoo() and monitor for any disconnect. If a disconnect is detected, it'll call mainFoo() again def bunchOfOtherMonitors(): #functions monitoring for other things in parallel
怎样实现呢?
admin 更改状态以发布 2023年5月21日
根据您的程序结构,您可能想尝试像这样的方法:
import _thread import sys import time def monitor(function): def wrapper(*args, **kwargs): sys.stdout.write('Starting ' + function.__name__ + '\n') result = function(*args, **kwargs) sys.stdout.write('Stopping ' + function.__name__ + '\n') return result return wrapper @monitor def main(): lock = _thread.allocate_lock() lock.acquire() _thread.start_new_thread(mainFoo, (lock,)) _thread.start_new_thread(monitorDisconnect, (lock,)) deadlock = _thread.allocate_lock() _thread.start_new_thread(bunchOfOtherMonitors, (deadlock,)) with deadlock: deadlock.acquire() @monitor def bunchOfFoos(): time.sleep(5) @monitor def mainFoo(lock): try: bunchOfFoos() finally: lock.release() @monitor def monitorDisconnect(lock): with lock: print('mainFoo has finished executing') @monitor def bunchOfOtherMonitors(deadlock): time.sleep(10) deadlock.release() if __name__ == '__main__': main()
如果您使用更高级的 threading
模块,也可以实现非常类似的功能:
from threading import * import sys import time def monitor(function): def wrapper(*args, **kwargs): sys.stdout.write('Starting ' + function.__name__ + '\n') result = function(*args, **kwargs) sys.stdout.write('Stopping ' + function.__name__ + '\n') return result return wrapper @monitor def main(): main_foo = Thread(target=mainFoo) monitor = Thread(target=monitorDisconnect, args=(main_foo,)) main_foo.start() monitor.start() other_monitors = Thread(target=bunchOfOtherMonitors) other_monitors.start() other_monitors.join() @monitor def bunchOfFoos(): time.sleep(5) @monitor def mainFoo(): bunchOfFoos() @monitor def monitorDisconnect(main_foo): main_foo.join() print('mainFoo has finished executing') @monitor def bunchOfOtherMonitors(): time.sleep(10) if __name__ == '__main__': main()