python多线程与多进程

教程网站

(31条消息) Python之多进程与多线程_宗而研之的博客-CSDN博客_python 多线程

多线程

优势

适合 I/O 密集型应用。

多线程实现

import threading
# 这个函数名可随便定义
def run(n):
print("current task:", n)
if __name__ == "__main__":
t1 = threading.Thread(target=run, args=("thread 1",))
t2 = threading.Thread(target=run, args=("thread 2",))
t1.start()
t2.start()

多线程全局变量

多线程共享全局变量,一个线程对于全局变量进行更改后,下一个线程访问时全局变量为更改后的变量。

多线程同时接受各个线程的返回值

方法一

全局变量的列表,append 是线程安全的

方法二

自定义类别继承 thread,给 join 方法添加返回值

代码

class ThreadWithReturnValue(Thread):
def run(self):
if self._target is not None:
self._return = self._target(*self._args, **self._kwargs)
def join(self):
super().join()
return self._return

出错

如果通过自定义类给 Join 添加一个返回值,会导致有时候线程 run 结束了,再 join 就没有返回值了。

方法三

代码

import concurrent.futures
def foo(bar):
return bar
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
to_do = []
for i in range(10): # 模拟多个任务
future = executor.submit(foo, f"hello world! {i}")
to_do.append(future)
for future in concurrent.futures.as_completed(to_do): # 并发执行
print(future.result())

多进程

优势

适合 CPU 密集型应用

多进程实现

from multiprocessing import Process
def show(name):
print("Process name is " + name)
if __name__ == "__main__":
proc = Process(target=show, args=('subprocess',))
proc.start()
proc.join()

多进程接收返回值

def number(done_queue):
done_queue.put(5)

done_queue = multiprocessing.Queue()
x = Process(target=number, args=(done_queue))
x.start()
x.join()
y = [i for i in done_queue]
print(y)

多进程与 pycharm

不能使用 python console 运行多进程代码,不然会报以下的错误:
EOFError: Ran out of input
解决方案:run config,取消勾选通过 python console 运行代码

多进程与全局变量

当操作系统使用 spawn 来创建新的进程时,比如 Windows,它会创建一个新的地址空间,并启动一个新的 Python 解释器,从第一行代码开始执行(解释)你的源程序。这意味着全局范围内的任何可执行语句都将被执行。