Python 中的真正并发
True Concurrency in Python
我对 Python 中的并发比较陌生,我正在处理一些必须在我的代码之外调用函数的代码。我无法编辑这些函数,但我需要它们同时 运行。我尝试了几种不同的解决方案,例如多处理、线程和 AsyncIO。如果我调用的每个函数都用它定义,AsyncIO 最接近我想要的,但它们不是。
我调用的函数会阻塞。有时持续 15-30 分钟。在那段时间里,我需要其他功能来做其他事情。下面的代码说明了我的问题。如果你 运行 它你会发现无论是使用线程还是多进程,任务总是 运行 串行。我需要它们 运行 彼此同时进行。我知道输出块直到整个脚本 运行s,但任务本身不应该。
我错过了什么?在 Python 中有这么多的并发选择或至少明显的并发,我认为这比我发现的要容易。
#!/usr/bin/python3
from datetime import datetime
from multiprocessing import Process
import sys
from threading import Thread
from time import sleep
def main():
# Doing it with the multiprocess module
print("Using MultiProcess:")
useprocs()
print("\nUsing Threading:")
usethreads()
def useprocs():
procs = []
task1 = Process(target=blockingfunc('Task1'))
task1.start()
procs.append(task1)
task2 = Process(target=blockingfunc('Tast2'))
task2.start()
procs.append(task2)
task1.join()
task2.join()
print('All processes completed')
def usethreads():
threads = []
task3 = Process(target=blockingfunc('Task3'))
task3.start()
threads.append(task3)
task4 = Process(target=blockingfunc('Task4'))
task4.start()
threads.append(task4)
task3.join()
task4.join()
print('All threads completed')
def blockingfunc(taskname):
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print(current_time, "Starting task: ", taskname)
sleep(5)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print(current_time, taskname, "completed")
if __name__ == '__main__':
try:
main()
except:
sys.exit(1)
请注意,您发布的程序导入了 Thread
但从未使用它。
更重要的是,在一行中:
task1 = Process(target=blockingfunc('Task1'))
您正在 调用 blockingfunc('Task1')
并传递它 returns (None
) 作为 target
的值争论。根本不是你想要的。您的意图:
task1 = Process(target=blockingfunc, args=['Task1'])
然后,正如预期的那样,在您调用 start()
方法之前实际上并未调用 blockingfunc
。
我对 Python 中的并发比较陌生,我正在处理一些必须在我的代码之外调用函数的代码。我无法编辑这些函数,但我需要它们同时 运行。我尝试了几种不同的解决方案,例如多处理、线程和 AsyncIO。如果我调用的每个函数都用它定义,AsyncIO 最接近我想要的,但它们不是。
我调用的函数会阻塞。有时持续 15-30 分钟。在那段时间里,我需要其他功能来做其他事情。下面的代码说明了我的问题。如果你 运行 它你会发现无论是使用线程还是多进程,任务总是 运行 串行。我需要它们 运行 彼此同时进行。我知道输出块直到整个脚本 运行s,但任务本身不应该。
我错过了什么?在 Python 中有这么多的并发选择或至少明显的并发,我认为这比我发现的要容易。
#!/usr/bin/python3
from datetime import datetime
from multiprocessing import Process
import sys
from threading import Thread
from time import sleep
def main():
# Doing it with the multiprocess module
print("Using MultiProcess:")
useprocs()
print("\nUsing Threading:")
usethreads()
def useprocs():
procs = []
task1 = Process(target=blockingfunc('Task1'))
task1.start()
procs.append(task1)
task2 = Process(target=blockingfunc('Tast2'))
task2.start()
procs.append(task2)
task1.join()
task2.join()
print('All processes completed')
def usethreads():
threads = []
task3 = Process(target=blockingfunc('Task3'))
task3.start()
threads.append(task3)
task4 = Process(target=blockingfunc('Task4'))
task4.start()
threads.append(task4)
task3.join()
task4.join()
print('All threads completed')
def blockingfunc(taskname):
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print(current_time, "Starting task: ", taskname)
sleep(5)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print(current_time, taskname, "completed")
if __name__ == '__main__':
try:
main()
except:
sys.exit(1)
请注意,您发布的程序导入了 Thread
但从未使用它。
更重要的是,在一行中:
task1 = Process(target=blockingfunc('Task1'))
您正在 调用 blockingfunc('Task1')
并传递它 returns (None
) 作为 target
的值争论。根本不是你想要的。您的意图:
task1 = Process(target=blockingfunc, args=['Task1'])
然后,正如预期的那样,在您调用 start()
方法之前实际上并未调用 blockingfunc
。