对于线程与线程相比,Actors的工作方式是否有任何好的和简短的解释?
一个线程不能被视为一个actor并将消息发送到其他线程吗?我看到了一些不同,但对我来说并不是那么清楚.我可以通过不同的线程使用任何语言的Actors吗?
我一直在阅读文档和搜索,但似乎无法找到一个直接的答案:
你能取消已经执行的任务吗?(在任务开始时,需要一段时间,需要取消一半)
我在Celery FAQ的文档中找到了这个
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Run Code Online (Sandbox Code Playgroud)
但我不清楚这是否会取消排队的任务,或者它是否会杀死一个正在运行的进程.感谢您可以放下任何光线!
我一直在研究学习erlang,结果一直在阅读(好的,略读)演员模型.
根据我的理解,actor模型只是一组函数(在erlang中称为"processes"的轻量级线程中运行),它们只通过消息传递相互通信.
在C++或任何其他语言中实现这似乎相当简单:
class BaseActor {
std::queue<BaseMessage*> messages;
CriticalSection messagecs;
BaseMessage* Pop();
public:
void Push(BaseMessage* message)
{
auto scopedlock = messagecs.AquireScopedLock();
messagecs.push(message);
}
virtual void ActorFn() = 0;
virtual ~BaseActor() {} = 0;
}
Run Code Online (Sandbox Code Playgroud)
每个进程都是派生的BaseActor的一个实例.演员只能通过消息传递相互通信.(即推).Actors在初始化时使用中心映射注册自己,允许其他actor找到它们,并允许中心函数运行它们.
现在,我明白我错过了,或者更确切地说,在这里掩盖了一个重要的问题,即:缺乏屈服意味着单个演员可以不公平地消耗过多的时间.但是跨平台协程是否会使C++难以实现?(例如,Windows有光纤.)
还有什么我想念的,或者这个模型真的很明显吗?
我绝对不是想在这里开始一场火焰战争,我只想了解我所缺少的东西,因为这基本上就是我已经做过的能够在某种程度上推断并发代码的原因.
我正在尝试为Android创建自己的MusicPlayer.我遇到问题的地方是在后台运行一些东西.主要活动管理GUI,到目前为止所有的歌曲都在播放.我想分开GUI和音乐播放课程.我想把音乐管理部分放在服务中,并留下现在的其他东西.
我的问题是我无法组织活动和服务之间的沟通,因为它们之间正在进行大量的沟通,包括双向移动物体.我尝试了很多技术,我在这里搜索Stack Overflow但每次遇到问题时都会这样做.我需要Service才能将对象发送到Activity,反之亦然.当我添加小部件时,我也希望它能够与服务进行通信.
任何提示都很受欢迎,如果你需要源代码发表评论,但现在在这个转变中它变得混乱.
是否有更高级的教程,而不是调用一个从服务返回随机数的方法?:P
编辑:可能的解决方案是使用RoboGuice库并注入移动对象
我试图在选项卡内的两个活动之间传递数据.我正在尝试使用sendBroadcast().设置断点我永远不会到达onReceive().
表现:
<activity
android:name=".WebResults"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.toxy.LOAD_URL" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
活动发件人:
Intent intent=new Intent(getApplicationContext(),WebResults.class);
intent.setAction("com.toxy.LOAD_URL");
intent.putExtra("url",uri.toString());
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
活动接收者:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter filter = new IntentFilter("com.toxy.LOAD_URL");
this.registerReceiver(new Receiver(), filter);
}
private class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String url = arg1.getExtras().getString("url");
WebView webview =(WebView)findViewById(R.id.webView);
webview.loadUrl(url);
}
}
Run Code Online (Sandbox Code Playgroud) 我对通过Post()或SendAsync()发送项目之间的区别感到困惑.我的理解是,在所有情况下,一旦项目到达数据块的输入缓冲区,控制权将返回到调用上下文,对吗?那为什么我需要SendAsync?如果我的假设不正确,那么我想,相反,如果使用数据块的整个想法是建立并发和异步环境,为什么有人会使用Post().
我当然理解技术上的差异,Post()返回一个bool,而SendAsync返回一个等待bool的任务.但是它有什么影响呢?何时返回bool(我理解是否确认该项是否放在数据块的队列中)会被延迟?我理解async/await并发框架的一般概念,但在这里并没有多大意义,因为除了bool之外,对传入项所做的任何操作的结果都不会返回给调用者,而是放在一个"out-queue"并转发到链接数据块或丢弃.
发送项目时两种方法之间是否存在性能差异?
c# concurrency message-passing task-parallel-library tpl-dataflow
如果我错了,请纠正我,但我很惊讶以前没有问过这里......
消息传递和方法调用之间是否存在差异,或者它们是否可以被视为等效?这可能是语言特有的; 许多语言不支持消息传递(尽管我能想到支持方法的所有语言),并且那些语言可以具有完全不同的实现.此外,方法调用存在很大差异,具体取决于语言(C vs. Java vs Lisp vs您最喜欢的语言).我相信这与语言无关.对于使用调用方法无法执行的传递方法,您可以做什么,反之亦然(使用您喜欢的语言)?
是while (true) { ... }循环的线程不好?有什么选择?
更新; 我想要做什么......
我有~10,000个线程,每个线程都使用来自其私有队列的消息.我有一个线程一个接一个地生成消息并将它们放在正确的消费者队列中.每个消费者线程无限循环,检查消息是否出现在队列中并进行处理.
在Consumer.java里面:
@Override
public void run() {
while (true) {
Message msg = messageQueue.poll();
if (msg != null) {
... // do something with the message
}
}
}
Run Code Online (Sandbox Code Playgroud)
Producer正在快速地将消息放入消费者消息队列中(每秒数百万条消息).消费者应该尽快处理这些消息!
注意:while (true) { ... }由Producer作为最后一条消息发送的KILL消息终止.但是,我的问题是关于做这个消息传递的正确方法......
有关此设计,请参阅新问题.
哪些语言的消息传递语法类似于Smalltalk?Objective-C是我唯一熟悉的.具体地讲,我想知道是否存在任何其它的语言实现,其允许在类似形式的语法:[anObject methodWithParam:aParam andParam:anotherParam]具有其允许命名参数的方法定义部分的消息.
一般来说,我发现这种语法可以有助于更一致的方法名称,更清楚地显示方法的意图,并且你付出的字面价格通常是值得的.我很想知道是否有其他语言支持这一点.
syntax smalltalk language-design objective-c message-passing
message-passing ×10
concurrency ×5
actor ×2
android ×2
broadcast ×1
c# ×1
c++ ×1
celery ×1
django ×1
erlang ×1
java ×1
loops ×1
objective-c ×1
python ×1
smalltalk ×1
syntax ×1
tpl-dataflow ×1