mirror of
https://github.com/Estom/notes.git
synced 2026-04-14 02:10:47 +08:00
matplotlib & pandas
This commit is contained in:
98
Python/matplotlab/gallery/misc/multiprocess_sgskip.md
Normal file
98
Python/matplotlab/gallery/misc/multiprocess_sgskip.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# 多进程
|
||||
|
||||
演示使用多处理在一个过程中生成数据并在另一个过程中绘图。
|
||||
|
||||
由Robert Cimrman撰写
|
||||
|
||||
```python
|
||||
import multiprocessing as mp
|
||||
import time
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
|
||||
# Fixing random state for reproducibility
|
||||
np.random.seed(19680801)
|
||||
```
|
||||
|
||||
## 进程类
|
||||
|
||||
此类绘制从管道接收的数据。
|
||||
|
||||
```python
|
||||
class ProcessPlotter(object):
|
||||
def __init__(self):
|
||||
self.x = []
|
||||
self.y = []
|
||||
|
||||
def terminate(self):
|
||||
plt.close('all')
|
||||
|
||||
def call_back(self):
|
||||
while self.pipe.poll():
|
||||
command = self.pipe.recv()
|
||||
if command is None:
|
||||
self.terminate()
|
||||
return False
|
||||
else:
|
||||
self.x.append(command[0])
|
||||
self.y.append(command[1])
|
||||
self.ax.plot(self.x, self.y, 'ro')
|
||||
self.fig.canvas.draw()
|
||||
return True
|
||||
|
||||
def __call__(self, pipe):
|
||||
print('starting plotter...')
|
||||
|
||||
self.pipe = pipe
|
||||
self.fig, self.ax = plt.subplots()
|
||||
timer = self.fig.canvas.new_timer(interval=1000)
|
||||
timer.add_callback(self.call_back)
|
||||
timer.start()
|
||||
|
||||
print('...done')
|
||||
plt.show()
|
||||
```
|
||||
|
||||
## 绘图类
|
||||
|
||||
此类使用多处理来生成一个进程,以运行上面的类中的代码。 初始化时,它会创建一个管道和一个ProcessPlotter实例,它将在一个单独的进程中运行。
|
||||
|
||||
从命令行运行时,父进程将数据发送到生成的进程,然后通过ProcessPlotter中指定的回调函数绘制:__call__。
|
||||
|
||||
```python
|
||||
class NBPlot(object):
|
||||
def __init__(self):
|
||||
self.plot_pipe, plotter_pipe = mp.Pipe()
|
||||
self.plotter = ProcessPlotter()
|
||||
self.plot_process = mp.Process(
|
||||
target=self.plotter, args=(plotter_pipe,), daemon=True)
|
||||
self.plot_process.start()
|
||||
|
||||
def plot(self, finished=False):
|
||||
send = self.plot_pipe.send
|
||||
if finished:
|
||||
send(None)
|
||||
else:
|
||||
data = np.random.random(2)
|
||||
send(data)
|
||||
|
||||
|
||||
def main():
|
||||
pl = NBPlot()
|
||||
for ii in range(10):
|
||||
pl.plot()
|
||||
time.sleep(0.5)
|
||||
pl.plot(finished=True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if plt.get_backend() == "MacOSX":
|
||||
mp.set_start_method("forkserver")
|
||||
main()
|
||||
```
|
||||
|
||||
## 下载这个示例
|
||||
|
||||
- [下载python源码: multiprocess_sgskip.py](https://matplotlib.org/_downloads/multiprocess_sgskip.py)
|
||||
- [下载Jupyter notebook: multiprocess_sgskip.ipynb](https://matplotlib.org/_downloads/multiprocess_sgskip.ipynb)
|
||||
Reference in New Issue
Block a user