首页 > 其他分享 >无涯教程-D语言 - 并发

无涯教程-D语言 - 并发

时间:2023-11-18 15:32:13浏览次数:40  
标签:std received 教程 Thread void Worker 无涯 并发 import

并发使程序在多个线程上运行,一个示例是Web服务器同时响应多个客户端,并发通过消息传递很容易,但是它们基于数据共享则很难编写。

启动线程

函数spawn()将指针作为参数,并从该函数启动新线程,该函数执行的任何操作,包括它可能调用的其他函数,都将在新线程上执行。

import std.stdio; 
import std.stdio; 
import std.concurrency; 
import core.thread;
  
void worker(int a) { 
   foreach (i; 0 .. 4) { 
      Thread.sleep(1); 
      writeln("Worker Thread ",a + i); 
   } 
}

void main() { 
   foreach (i; 1 .. 4) { 
      Thread.sleep(2); 
      writeln("Main Thread ",i); 
      spawn(≈worker, i * 5); 
   }
   
   writeln("main is done.");  
}

编译并执行上述代码后,它将读取上一部分中创建的文件,并产生以下输出-

Main Thread 1 
Worker Thread 5 
Main Thread 2 
Worker Thread 6 
Worker Thread 10 
Main Thread 3 
main is done. 
Worker Thread 7 
Worker Thread 11 
Worker Thread 15 
Worker Thread 8 
Worker Thread 12 
Worker Thread 16 
Worker Thread 13
Worker Thread 17 
Worker Thread 18

线程标识符

在模块级别全局可用的 thisTid 变量始终是当前线程的ID,当调用spawn时,您也可以接收threadId。一个如下所示。

import std.stdio; 
import std.concurrency;  

void printTid(string tag) { 
   writefln("%s: %s, address: %s", tag, thisTid, &thisTid); 
} 
 
void worker() { 
   printTid("Worker"); 
}
  
void main() { 
   Tid myWorker=spawn(&worker); 
   
   printTid("Owner "); 
   
   writeln(myWorker); 
}

编译并执行上述代码后,它将读取上一部分中创建的文件,并产生以下输出-

Owner : Tid(std.concurrency.MessageBox), address: 10C71A59C 
Worker: Tid(std.concurrency.MessageBox), address: 10C71A59C 
Tid(std.concurrency.MessageBox)

消息传递

函数send()发送消息,而函数receiveOnly()等待特定类型的消息。还有其他名为prioritySend(),receive()和receiveTimeout()的函数,稍后将进行说明。

以下示例向其工作程序发送int类型的消息,并等待来自double类型的消息,线程继续来回发送消息,直到发送一个负整数。一个如下所示。

import std.stdio; 
import std.concurrency; 
import core.thread; 
import std.conv;  

void workerFunc(Tid tid) { 
   int value=0;  
   while (value >= 0) { 
      value=receiveOnly!int(); 
      auto result=to!double(value) * 5; tid.send(result);
   }
} 
 
void main() { 
   Tid worker=spawn(&workerFunc,thisTid); 
    
   foreach (value; 5 .. 10) { 
      worker.send(value); 
      auto result=receiveOnly!double(); 
      writefln("sent: %s, received: %s", value, result); 
   }
   
   worker.send(-1); 
} 

编译并执行上述代码后,它将读取上一部分中创建的文件,并产生以下输出-

sent: 5, received: 25 
sent: 6, received: 30 
sent: 7, received: 35 
sent: 8, received: 40 
sent: 9, received: 45 

等待传递消息

下面显示了一个带有等待消息传递的简单示例。

import std.stdio; 
import std.concurrency; 
import core.thread; 
import std.conv; 
 
void workerFunc(Tid tid) { 
   Thread.sleep(dur!("msecs")( 500 ),); 
   tid.send("hello"); 
}
  
void main() { 
   spawn(&workerFunc,thisTid);  
   writeln("Waiting for a message");  
   bool received=false;
   
   while (!received) { 
      received=receiveTimeout(dur!("msecs")( 100 ), (string message) { 
         writeln("received: ", message); 
      });

      if (!received) { 
         writeln("... no message yet"); 
      }
   } 
}

编译并执行上述代码后,它将读取上一部分中创建的文件,并产生以下输出-

Waiting for a message 
... no message yet 
... no message yet 
... no message yet 
... no message yet 
received: hello 

参考链接

https://www.learnfk.com/d-programming/d-programming-concurrency.html

标签:std,received,教程,Thread,void,Worker,无涯,并发,import
From: https://blog.51cto.com/u_14033984/8463043

相关文章

  • 并发之AQS源码学习
    /****学习AbstractQueuedSynchronizer**1.state是aqs的重要属性,说明锁的使用次数*2.CustomAbstractQueuedSynchronizer,存在head与tail属性,所以其本身就是一个链表。并没有使用集合*3.双向链表(等待队列)*1.head永远都是伪节点(thead=null)*......
  • 磁力搜索引擎大全教程,如何使用磁力链接。
      磁力链接是一种特殊的下载链接,磁力链接可以理解为一个文件识别码,而并非具体的资源地址,下载软件需要拿着这个识别码去整个互联网(DHT网络)去寻找持有该资源的用户(节点),如果找到则可以进行传输下载。一般年代越久远的磁力链接下载成功的几率越小,因为持有该资源的节点越少。一......
  • 无涯教程-D语言 - 文件I/O
    文件File由std.stdio模块的File结构表示,文件表示字节序列,无论是文本文件还是二进制文件都没有关系,D编程语言提供对高级函数的访问/处理存储设备上文件。打开文件首先通过指定文件名和所需的访问权限来打开文件。Filefile=File(filepath,"mode");在这里,filename是字符串......
  • 无涯教程-D语言 - 不可变(Immutables)
    我们经常使用可变的变量,但是在很多情况下不需要可变性。D的不变性概念由const和immutable关键字表示,尽管这两个词本身的含义很接近,但它们在程序中的职责有所不同,有时是不兼容的。枚举常量枚举常量使将常量值与有意义的名称相关联成为可能,一个简单的如下所示。importstd.stdi......
  • Windos操作系统下的Zookeeper安装图文教程
    凯哥已经准备好最新版本3.9.1且已经配置好了。既获取到配置好的。获取到凯哥准备的安装后,只需要修改一下配置。将解压包解压后,找到conf文件,里面有个zoo.cfg配置文件。如下图:下载后conf文件夹内容打开zoo.cfg配置文件后,找到13、14这两行。将dataDir和dataLogDir的路径修改成自......
  • Windos操作系统下的Zookeeper安装图文教程
    凯哥已经准备好最新版本3.9.1且已经配置好了。既获取到配置好的。获取到凯哥准备的安装后,只需要修改一下配置。将解压包解压后,找到conf文件,里面有个zoo.cfg配置文件。如下图:下载后conf文件夹内容打开zoo.cfg配置文件后,找到13、14这两行。将dataDir和dataLogDir的路径修改成自己的就......
  • 无涯教程-D语言 - 模板(Templates)
    模板是通用编程的基础,它涉及以独立于任何特定类型的方式编写代码。函数模板将函数定义为模板会将其使用的一种或多种类型保留为未指定状态,以便稍后由编译器推导。在模板参数列表中定义了未指定的类型,该参数介于函数名称和函数参数列表之间。因此,函数模板具有两个参数列表-模板......
  • kafka安装教程
    检查java8没有就安装java-version安装jdk1.8yum-yinstalljava-1.8.0-openjdk下载kafka(网速很慢)wgethttps://dlcdn.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz解压缩tar-xzfkafka_2.13-3.5.0.tgzcdkafka_2.13-3.5.0后台启动ZooKeeper服务(这里使用kafka里......
  • 无涯教程-D语言 - 范围(Ranges)
    范围range是元素访问的抽象,范围强调如何访问容器元素,而不是如何实现容器。Numberranges数字范围是非常常用,这些数字范围是int类型的,下面是一些数字范围的示例-//示例1foreach(value;3..7)//示例2int[]slice=array[5..10];PhobosRanges与结构和类接口有关的范围是......
  • Kafka入门教程与详解(一)
    Kafka入门教程与详解(一)一、Kafka入门教程1.1消息队列(MessageQueue)MessageQueue消息传送系统提供传送服务。消息传送依赖于大量支持组件,这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消息服务器可以使用一个或多个代理实例。JMS(JavaMessaging......