Python中的真正并发

Python中的真正并发,python,multithreading,concurrency,multiprocessing,python-asyncio,Python,Multithreading,Concurrency,Multiprocessing,Python Asyncio,我对Python中的并发性比较陌生,我正在编写一些必须在代码之外调用函数的代码。我无法编辑这些函数,但我需要它们同时运行。我尝试过几种不同的解决方案,如多处理、线程和异步IO。如果我调用的每个函数都是用AsyncIO定义的,那么AsyncIO最接近我想要的,但它们不是 我正在调用的函数将被阻止。有时15-30分钟。在这段时间里,我需要做其他事情的其他函数。下面的代码说明了我的问题。如果您运行它,您将看到无论是使用线程还是多进程,任务都是串行运行的。我需要它们同时运行。我知道输出会一直阻塞直到整个

我对Python中的并发性比较陌生,我正在编写一些必须在代码之外调用函数的代码。我无法编辑这些函数,但我需要它们同时运行。我尝试过几种不同的解决方案,如多处理、线程和异步IO。如果我调用的每个函数都是用AsyncIO定义的,那么AsyncIO最接近我想要的,但它们不是

我正在调用的函数将被阻止。有时15-30分钟。在这段时间里,我需要做其他事情的其他函数。下面的代码说明了我的问题。如果您运行它,您将看到无论是使用线程还是多进程,任务都是串行运行的。我需要它们同时运行。我知道输出会一直阻塞直到整个脚本运行,但任务本身不应该

我错过了什么?有这么多并发选择,或者至少在Python中有明显的并发选择,我认为这比我现在发现的要容易

#/usr/bin/python3
从日期时间导入日期时间
从多处理导入进程
导入系统
从线程导入线程
从时间上导入睡眠
def main():
#使用多进程模块执行此操作
打印(“使用多进程:”)
useprocs()
打印(“\n使用线程:”)
usethreads()
def useprocs():
过程=[]
task1=进程(target=blockingfunc('task1'))
task1.start()
过程追加(任务1)
task2=进程(target=blockingfunc('Tast2'))
task2.start()
过程附加(任务2)
task1.join()
任务2.join()
打印('所有流程已完成')
def usethreads():
线程=[]
task3=进程(target=blockingfunc('task3'))
任务3.开始()
threads.append(task3)
task4=进程(target=blockingfunc('task4'))
任务4.开始()
threads.append(task4)
任务3.join()
任务4.join()
打印('所有线程已完成')
def blockingfunc(任务名称):
now=datetime.now()
当前时间=现在。strftime(“%H:%M:%S”)
打印(当前时间,“开始任务:”,任务名称)
睡眠(5)
now=datetime.now()
当前时间=现在。strftime(“%H:%M:%S”)
打印(当前时间,任务名称,“已完成”)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
main()
除:
系统出口(1)

请注意,您发布的程序导入
线程,但从不使用它

更重要的是,在这样一行中:

task1 = Process(target=blockingfunc('Task1'))
您正在调用
blockingfunc('Task1')
,并将它返回的内容(
None
)作为
目标
参数的值传递。完全不是你想要的。你的意图是:

task1 = Process(target=blockingfunc, args=['Task1'])

然后,正如预期的那样,在调用
start()
方法之前,实际上不会调用
blockingfunc

请注意,您发布的程序导入
线程,但从不使用它

更重要的是,在这样一行中:

task1 = Process(target=blockingfunc('Task1'))
您正在调用
blockingfunc('Task1')
,并将它返回的内容(
None
)作为
目标
参数的值传递。完全不是你想要的。你的意图是:

task1 = Process(target=blockingfunc, args=['Task1'])

然后,正如预期的那样,在调用
start()
方法之前,
blockingfunc
实际上没有被调用。

给这个人买杯啤酒!我盯着这段代码看了太久了,甚至没有看到我的usethreads函数没有调用线程。更重要的是,您对线程和进程在函数运行和args中所采用的方式的解释比我迄今为止读到的所有关于它们的网页都要简洁明了。谢谢你快速简洁的回复。给这个人买杯啤酒吧!我盯着这段代码看了太久了,甚至没有看到我的usethreads函数没有调用线程。更重要的是,您对线程和进程在函数运行和args中所采用的方式的解释比我迄今为止读到的所有关于它们的网页都要简洁明了。感谢您快速简洁的回复。