`

Elixir简单的wordcount小程序

 
阅读更多

本文来自:fair-jm.iteye.com 转截请注明出处

 

defmodule Wordcount do
   @moduledoc "simple wordcount program by fairjm"
   @nodecount 3
   
   def start(file) do
      s = self
	  spawn(fn -> count(file,s) end)
   end
   
   defp count(file,caller) do
		s = self
		nodes = Enum.map(1..@nodecount,fn _e -> spawn(fn -> countLine end) end)
		count = File.stream!(file)
				|> Enum.reduce(0,fn e,r -> send(Enum.at(nodes,:random.uniform(@nodecount)-1),{e,s});r+1 end)
		IO.puts("total count is #{count}")
		v = countDown(count,%{})
		nodes |> Enum.each(&(send(&1,Stop)))
		send(caller,v)
   end
   
   defp countDown(0,m) do
		IO.puts("ending")
		m
    end
	
   defp countDown(n,m) do
		receive do
			map -> countDown(n-1, Enum.reduce(map,m,fn {k,v},r -> Map.put(r,k,Map.get(r,k,0)+v) end)) 
			after 5000 -> countDown( n-1 , m)
		end
   end
   
   defp countLine do
		receive do
			{line,caller} ->
				IO.puts("#{inspect(self)} is doing work")
				m = line 
					|> String.strip
					|> String.split(" ")
					|> Stream.filter(&(String.length(&1) > 0))
					|> Enum.reduce(%{},fn e,r ->
												case r[e] do
													nil -> Map.put(r,e,1)
													v   -> Map.put(r,e,v+1)
												end
										end
									)
				send(caller,m)
				countLine
			Stop ->
				IO.puts("#{inspect(self)} quits")
			_other ->
				IO.puts("error message")
				countLine
		end
   end
end

 简单的小练习  代码中用三个erlang进程模拟mapper 一个进程模拟reducer  

 elixir的语法比erlang的要平易近人好多

 有兴趣学的同学 推介买一本elixir in action(http://www.manning.com/juric/)

 或者图灵社区有爱的同学整理的教程: http://www.ituring.com.cn/minibook/10831

 此外这位同学的github上也维护着中文学习资料: https://github.com/elixir-lang-cn/programming-elixir

0
0
分享到:
评论

相关推荐

    Elixir程序设计语言.pdf

    4.4 4.5 5.1 5.2 5.3 5.4 5.5 5.6 Mnesia 数据库 调试第五部分:程序库 Guardian(基础) Poolboy Benchee Bypass Distillery(基础) StreamData 3 Introduction 绪⾔第⼀部分:基础 基础集合Enum 模块 模式匹配 控制...

    Elixir编程入门

    - **应用程序**:Elixir项目可以被打包成一个或多个应用程序。 ##### 3.6 ETS - **ETS概念**:Erlang表系统,提供高效的内存数据库。 - **ETS使用**:使用`:ets.new/1`创建表,使用`get`、`put`等函数操作数据。 ...

    Elixir程序设计(英文版) pdf

    《Elixir 程序设计》作者就是15 年前编写了Programming Ruby,将Ruby 带入大众视野的Dave Thomas。这一次他延续了一贯的写作风格,以一个拥有面向对象的开发经历但并未接触过函数式编程的开发者的角度切入,循序渐进...

    Programming.Elixir.1.3

    Elixir 的设计初衷是为了开发可扩展、容错性强的应用程序,尤其适用于构建分布式系统。 #### 二、《Programming Elixir 1.3》概述 《Programming Elixir 1.3》是一本针对 Elixir 1.3 版本的教程书籍,由 Dave ...

    Elixir 程序设计 英文版 epub

    编程思想的转变是困难的, 我在读这本书的时候, 再一次感受到了编程思想的转变,从面向对象到面向进程。...在 Elixir 中变得无比简单, 这也是 Elixir 在现代 IT 系统中的价值:最大化 CPU 的处理能力。

    elixir安装

    1. **获取 Erlang 和 Elixir 安装程序** 首先,我们需要安装Erlang,因为Elixir依赖于它。访问[erlang-solutions.com](https://www.erlang-solutions.com/downloads/download-erlang-otp),找到适合你操作系统的...

    Atom-atom-elixir-formatter,Atom编辑器的Elixir源代码格式化程序。对rgreenjr/atom的贡献.zip

    Atom-atom-elixir-formatter是一款专为Atom编辑器设计的插件,旨在帮助用户自动格式化Elixir语言的源代码。Atom是一个由GitHub开发的、基于Web技术的开源文本编辑器,它允许用户通过安装各种插件来扩展其功能,以...

    postgrex:Elixir的PostgreSQL驱动程序

    Elixir的PostgreSQL驱动程序。 文档: : 例子 iex> {:ok, pid} = Postgrex.start_link(hostname: "localhost", username: "postgres", password: "postgres", database: "postgres") {:ok, #PID<0>} iex> ...

    Elixir in Action, 2nd Edition.pdf(无水印-正版PDF)

    Revised and updated for Elixir 1.7, Elixir in Action, Second Edition teaches you how to apply Elixir to practical problems associated with scalability, fault tolerance, and high availability....

    Programming Elixir 1.6 课程源代码

    **Elixir编程语言详解** Elixir是一种基于BEAM(Erlang虚拟机)的函数式、并发、面向消息的编程语言。它设计简洁,适合构建分布式、容错性高的系统。在"Programming Elixir 1.6"这本书中,作者深入浅出地介绍了...

    elixir中文入门文档

    - **可枚举接口**:Elixir提供了一套统一的枚举接口,使得处理列表、元组、字符串等变得简单。 - **流处理**:使用流处理可以高效地处理大量数据,尤其是当数据量非常大时。 #### 十二、进程 - **进程概念**:...

    Elixir erlang的书籍

    包含Elixir in Action,Elixir中文入门文档,Erlang and Elixir for Imperative Programmers,Erlang OTP并发编程实战-中文版,Erlang程序设计(第2版),Erlang编程指南,Functional.Web.Development.with.Elixir....

    Programming Elixir

    You’re also investigating designs that help you maximize uptime and manage security., This book is your guide to Elixir, a modern, functional, and concurrent programming language. Because Elixir ...

    elixir-style-guide, Elixir语言风格指南,由信条实现.zip

    elixir-style-guide, Elixir语言风格指南,由信条实现 信条 Style 序曲存在这里文档存在的两个原因:这是我的个人风格指南,包括我今天编写的Elixir,但更重要的是,我在野生和适应,因为他们使Elixir更可以读,在...

    Elixir 元编程

    了解并熟练掌握Elixir的元编程,能够帮助你编写更灵活、更高效的代码,同时也能提升Elixir应用程序的设计和可维护性。通过使用宏和其他元编程工具,你可以创建自定义的 DSL(领域特定语言),实现模块生成,甚至改变...

Global site tag (gtag.js) - Google Analytics