Python:如何并行运行两个函数。

17 浏览
0 Comments

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日
0
0 Comments

根据您的程序结构,您可能想尝试像这样的方法:

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()

0