matlab的多线程操作

matlab的多线程操作

        • 先导知识
        • 一、结论
        • 二、定时器timer
        • 三、多进程操作

先导知识

  1. 听说过:定时器中断、线程、进程
  2. 知道:matlab的帮助文档使用方式,如:doc memmapfile、help memmapfile
  3. 理解:回调函数,同步回调、异步回调(不知道也没关系,csdn里面很多人都写了这个)

一、结论

截止到2021a版本,matlab不能实现传统意义的多线程,但是可以实现并行计算(doc parallel)、定时器中断,以及利用磁盘映射实现多进程通信(doc memmapfile)

本文标题是有些“文不对题”的,实际上只是便于读者检索到该文章。

二、定时器timer

对于轻量级的任务,比如在命令行打印一个字符串,绘制一张点数不多的图,可以”模拟“多线程(本质上还是定时器中断)

该板块讲一下timer的基本使用,有底子的建议在matlab中或者浏览器中查阅timer的帮助文档:

1、基本用法

t = timer('BusyMode','queue','ExecutionMode', 'fixedspacing',...
 'Period',1/fps, 'TimerFcn', @call_back)

一般设置这几个就可以了,如果需要设置其他的,请自行查阅帮助文档。

(1)‘BusyMode’: 一般选‘queue’,排队执行,这样的话,不至于丢任务。

Character vector or string scalar that indicates action taken when a timer has to execute TimerFcn before the completion of previous execution of the TimerFcn. When Running='on', BusyMode is read only. This table summarizes the busy modes.

BusyMode Values Behavior if Queue Empty Behavior if Queue Not Empty Notes
'drop' Adds task to queue Drops task Possible skipping of TimerFcn calls
'error' Adds task to queue Completes task; throws error specified by ErrorFcn; stops timer Stops timer after completing task in execution queue
'queue' Adds task to queue Waits for queue to clear, and then enters task in queue Adjusts Period property to manage tasks in execution queue

(2)‘Period’:两次回调之间间隔时间;

(3)‘ExecutionMode’:设置下一次回调从什么时候开始,这四个都可能用到,根据需求来。

singleShot:只执行一次;

fixedRate:从上一次回调进入排队开始,经过一个周期,再进入下一次回调;
fixedDelay:经过一个time lag之后,经过一个周期,再进入下一次回调;
fixedSpacing:上一次回调结束之后,经过一个周期,再进入下一次回调;
matlab的多线程操作_第1张图片(4)‘TimerFcn’, @call_back

设置回调函数,这个有点复杂。timer本质上就是一个定时器中断,它通过将任务(call_back)排队执行,它的”回调方式“是根据’ExecutionMode’的设置来确定的,不是传统意义上的同步回调或者异步回调。

三、多进程操作

所谓多进程操作,就是开多个matlab,通过访问硬盘当中的同一个内存空间,实现多个进程之间的通信,从而做到做进程操作。

用到的关键函数是:memmapfile

这里贴一个我自己做测试时用的demo,看不懂的可以在评论区问,看见了就会回复。

注意:两个进程不能同时访问一块内存空间,否则会报错。
(由于matlab语言在markdown格式下,没有高亮,所以下面的两个代码块是选择的是c语言)
第一个.m文件

% 写入一些数据
myData = (1:10)';
fileID = fopen('records.dat','w');
fwrite(fileID,myData,'double');
fclose(fileID);
% 改变一些数据
while 1
m = memmapfile('records.dat','Format','double','Writable',true) ;
m.Data(1) = m.Data(1)+1;
disp(m.Data);
clear m
pause(1)
end

第二个.m文件

%将内存空间'records.dat'的内容打印出来
while 1
m = memmapfile('records.dat','Format','double','Writable','false') ;
disp(m.Data)
clear m
pause(1)
end

你可能感兴趣的:(matlab技术,多进程,matlab)