外汇横向联合问题

华语简体字 <->繁体字转换 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx   
Disco        
:http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx?disco
WSDL       
:http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx?wsdl

呢可能是0号线程已经进下一样步了,00100101

中国开放式基金数量 WEB 服务
Endpoint :http://www.webxml.com.cn/WebServices/ChinaOpenFundWS.asmx
Disco       
: http://www.webxml.com.cn/WebServices/ChinaOpenFundWS.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/ChinaOpenFundWS.asmx?wsdl

举个外汇例子,一年的外汇数据,价格转移大致是2000万涂鸦,所以,只是一个非常简单的策略,模拟一下百分之百历史,也是如十分可怜的计算量。要化解之问题一般只要用分布式的算计。当然,同时为使增进单台机器的属性,这便需要出现,把持有的cpu核都为此掉。幸运的凡,计算量最深的有的,交易策略内部一般是可彼此的,判断买卖中也是可以并行的,但是生一些倒霉的是,判断买卖的经过得顶有的贸易策略计算好后,才会拓展测算。这样即使事关一个合的问题。如下图,这4只cpu不能够凭并行,每一样差计算了交易策略,都如对等其它的交易策略形成,才能够进来下一致步判断买卖。

外汇-人民币就报价 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/ForexRmbRateWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/ForexRmbRateWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/ForexRmbRateWebService.asmx?wsdl

go就是打开一个初的线程。线程里面做的业务分成3步 Step1 , Step2, Step3.
列一样步都生一个wait等待其他的线程也尽好。在风的起编程里面,这个题材可以为此规范变量来落实,但是,在go里面,因为未是不行推荐用锁定,所以我用了channel来兑现。经过自身的测试,这channel

锁的落实方案还比慢,而且性能非常之近乎。这篇稿子,我事先介绍如何用channel的章程来兑现,锁就未介绍了,不过自己还会见介绍一栽不用锁,也无用channel的道。

中国电视节目预告(电视节目表) WEB 服务
Endpoint
:http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx
Disco       
:http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl

   
这个方案是非常之一清二楚,但是,性能上多少差,300万破联袂的耗时于20s横。这个特性,对咱的题目莫过于是十足用底,一年2000万的数,我们一个方针一般要飞1独小时以上,损失两分钟共的时,非常值得了。但是,也来某些给客户演示的国策,非常简单,比如一个全都线,那么可能走同一涂鸦共就10s,调度时间花去矣有限分钟,这就算闹硌多矣。所以,还得更上一层楼一些。

验证码图片 WEB 服务 支持中文、字母、数字 图像及多媒体
Endpoint
:http://www.webxml.com.cn/WebServices/ValidateCodeWebService.asmx
Disco         
:http://www.webxml.com.cn/WebServices/ValidateCodeWebService.asmx?disco
WSDL      
:http://www.webxml.com.cn/WebServices/ValidateCodeWebService.asmx?wsdl

当然,解决方案并无是首要,我怀念使于大家之凡:我是哪些想到这些方案的,是根据什么思路?遇到一个题材,如何与剖析,如何找到问题之重要,这才是无比关键之,要增长编程水平,就要经常这么去想问题。图备受之线程,我们发现还是针对顶之,怎么同步啊?难道是0号线程完毕后,要通知任何线程,同时1声泪俱下线程完毕后,也要通报任何线程吗?这样做肯定不好,因为通知不过多,那怎么处置吧?一个高效的集体得有个领导,有一个首长,那么大家好后,都朝着领导反馈,由官员来决定是未是大家还好了。那谁来当主任啊?还是按中国民俗,嫡长子当官员(我就算是我家的嫡长子,因为我妈就够呛了自家一个)。

火车时刻表 WEB 服务 (第六破提速最新列车时刻表)
Endpoint
:http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl

func wait(index int, inc *int32, step []chan int) {

    if index > 0 {

        atomic.AddInt32(inc, 1)

        step[index] <- 1 //往管道里面写,如果领导没有检查通过,那么就阻塞

    } else {

        for {

            if int(*inc) == len(step) - 1 { //大家已经都准备好了

                break

            }

            runtime.Gosched()

        }

        atomic.StoreInt32(inc, 0)

        for i := 1; i < len(step); i++ {

            <-step[i] //领导检查完毕,可以继续执行了

        }

    }

}

Email 电子邮件地址验证 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/ValidateEmailWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/ValidateEmailWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/ValidateEmailWebService.asmx?wsdl

   
我们筹程序的下,首先要确保有的状态而逾少越好。比如上面的问题,如果自己引入一个变量来表示“大家都曾经完结”,那么当通告了大家,大家进下同样步的时,就非得铲除这个状态,这样必然会引入一个哟时解除这样一个态。

腾讯QQ在线状态 WEB 服务
Endpoint :http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx
Disco        
:http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?disco
WSDL      
:http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl

 

立外汇汇率数据 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/ExchangeRateWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/ExchangeRateWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/ExchangeRateWebService.asmx?wsdl

   
如果由一个自动机的角度来说,要比较简单,那么就算是经过许多态后,最终回归至有一个状态。你晤面发现channel版本就是召开了这么一个政工,经过同蹩脚wait后,有恢复至开状态,可以进入下次wait了。

国内飞机航班时刻表 WEB 服务
Endpoint :http://www.webxml.com.cn/webservices/DomesticAirline.asmx
Disco        
: http://www.webxml.com.cn/webservices/DomesticAirline.asmx?disco 
WSDL      
: http://www.webxml.com.cn/webservices/DomesticAirline.asmx?wsdl

若官员检查至 READY(00000111)了,那么将状态就装为,00111111

股票行情数据 WEB
服务(支持香港、深圳、上海本、债券以及股票;支持多股票而询问)
Endpoint :http://www.webxml.com.cn/WebServices/StockInfoWS.asmx
Disco       
:http://www.webxml.com.cn/WebServices/StockInfoWS.asmx?disco
WSDL       :http://www.webxml.com.cn/WebServices/StockInfoWS.asmx?wsdl

1 号线程通知到了,就成 
00100100,当然,这不是绝无仅有状态,在是时刻,2号线程可能先消除,这个时是
00000000

神州股票行情数据 WEB 服务(支持深圳以及上海股市的资本、债券和股票)
Endpoint
:http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx
Disco        
:http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx?wsdl

   
这个状态自动回归而或于另地方,或者开上从来不怎么听说了,只是私房的片经验。很多人口,写起的次第尚未思路,而且bug丛生,很多上,没有考虑到状态回归的题材。如果管并发的状态作为一个自动机,那么多,所有状态中都能跃迁,比串行程序的状态而多的多。因为并作了后,之前多群状态里产生的一一不肯定,就比如,愤怒小鸟那个众皮球跳的那一关,一个小鸟稍微干扰一下跳动,那么皮球就可知过到每个空间,把猪猪都杀死。而如此的几近之状态下,往往会引起部分生不起眼的bug。

IP地址来源搜索 WEB 服务(是当前最为完好的IP地址数据)
Endpoint
:http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx
Disco        
:http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?disco
WSDL      
:http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

外汇 1

华语 <-> 英文双向翻译 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx?wsdl

 

中国股票行情分时走势预览缩略图 WEB 服务
Endpoint
: http://www.webxml.com.cn/webservices/ChinaStockSmallImageWS.asmx
Disco       
: http://www.webxml.com.cn/webservices/ChinaStockSmallImageWS.asmx?disco
WSDL     
: http://www.webxml.com.cn/webservices/ChinaStockSmallImageWS.asmx?wsdl

以自我的机上通过测试,这个差不多100万个冒出,消耗1s,比channel版本的发生非常老的滋长。你呢得以设计好之wait同步方法,可以与我交流交流。最终之序的result3
== 0
那么,就是wait写的莫问题。题外话,对这类似高性能计算问题,go比c#假如抢多,而且内存为只要探望多(我之意说,用C#引进的办法编程,而无是为此各种方法死抠性能,不知道C#的这么方式的联名速度发出多快)。

天气预报Web服务,数据来中国气象局
Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
Disco      
:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

func main() {

    N := runtime.NumCPU()

    runtime.GOMAXPROCS(N)

    goend := make(chan int)

    t := time.Now()

    for i := 0; i < N; i++ {

        go func (index int, end chan int) {

            //fmt.Println("beg run", index)

            for i := 0; i < 1000000; i++ {

                Step1(i, index)

                wait(index, &inc, step)

                Step2(i, index)

                wait(index, &inc, step)

                Step3(i, index)

                wait(index, &inc, step)

            }

            //fmt.Println("end run", index)

           goend <- 1

        }(i, end)

    }

    for i := 0; i < N; i++ {

        <-goend

    }

    fmt.Println(result3, time.Now().Sub(t))

}

随意英文、数字和国语简体字 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?disco
WSDL      
:http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl

    好了,不赘述了。看最终版的代码:

中国邮政编码 <-> 地址信息双向查询/搜索 WEB 服务
Endpoint
:http://www.webxml.com.cn/WebServices/ChinaZipSearchWebService.asmx
Disco       
:http://www.webxml.com.cn/WebServices/ChinaZipSearchWebService.asmx?disco
WSDL     
:http://www.webxml.com.cn/WebServices/ChinaZipSearchWebService.asmx?wsdl

 

下我把最后之测试代码贴出来,注意,如果如当实质上中采用,还是如专注一下接口的合理设计与包装。不能够一直这样以。

 

READY = 1 << (N – 1) – 1,如果N = 4 ,那么表示成二进制就是
00000111

COMMIT = 1 << (N -1), 如果N = 4,那么表示成二进制就是  00001000

形容成代码就是这么的(go语言):

0 如泣如诉线程通知及了 ,就成为: 00110110

此处,和上次无一致,不再是嫡长子当领导了,当领导的是最终一个线程(这里如此处理要有利一点,所以还是当鸡头,要么当凤尾,夹在中间做事情,反而没有机会,哈哈)

N –1 到 2N – 3 各类代表线程是否可进来下一致步(大家还得了)了

 

 

   
inc是一个计数器,线程之间共享的,用来代表出几只线程已经履行完毕了。step是一个channel的累组,每个线程对应一个。代码已经会怪鲜明的辨证问题了。不过眼尖的同室或会见看到,有个死循环啊,会无会见充分浪费cpu时间。我的答案是无会见。runtime.Gosched()
表示将时间片让给别人,自己相似是死了,这是一个生高档的sleep,我们常常会面遇上要sleep多久的问题,这里并非考虑了,别人就后,自然会通报你。根据自己最后的统计,runtime.Gosched() 
每次wait平均会实施两不好左右,而这边要用sleep,会发现性能大之差。

0 到 N-2 位 表示线程是否准备好了

 

相似写程序,遇到这么的题材是最头痛了。我们因此了引进的计解决了一个问题,最后发现这个题材最慢了。于是,我想到用用规范变量,发现,和chan的特性好相近,就以山重水复疑无路的时光,我耍了点滴转悠三皇家好,结果灵感又来了。仔细分析者版本的次,实际上,经历了区区单过程:一个是大家朝着领导汇报的进程,一个经过是领导者关照大家还曾做到了。于是,我想开用一个变量表示一下完事了,直接发现很,因为,这样的话,领导要等大家还吸纳通报后,清除变量,这个大家还吸收通知然后通知受长官不好处理。

package main

 

import "fmt"

import "sync"

import "sync/atomic"

import "time"

import "runtime"

 

const N = 4

const READY = int32(1 << (N - 1) - 1)

const COMMIT = int32(1 << (N -1))

var mutex sync.Mutex

var inc int32

 

var result1 int32

var result2 int32

var result3 int32

 

func main() {

    fmt.Println("ncpu = ", runtime.NumCPU())

    runtime.GOMAXPROCS(runtime.NumCPU())

    end := make(chan int)

    t := time.Now()

    for i := 0; i < N; i++ {

        go run(i, end)

    }

    for i := 0; i < N; i++ {

      <-end

    }

    fmt.Println(result3, time.Now().Sub(t))

}

 

func run(index int, end chan int) {

    //fmt.Println("beg run", index)

    for i := 0; i < 1000000; i++ {

        Step1(i, index)

        wait(index, &inc)

        Step2(i, index)

        wait(index, &inc)

        Step3(i, index)

        wait(index, &inc)

    }

    //fmt.Println("end run", index)

    end <- 1

}

 

func Step1(i int, index int) {

    atomic.AddInt32(&result1, int32(i))

    //fmt.Println("step 1", index)

}

 

func Step2(i int, index int) {

    atomic.AddInt32(&result2, int32(i))

    //fmt.Println("step 2", index)

}

 

func Step3(i int, index int) {

    mutex.Lock()

    if result2 != result1 {

        //fmt.Println("error", result1, result2, result2 - result1, i, index)

    }

    atomic.AddInt32(&result3, result2)

    atomic.AddInt32(&result3, -result1)

    atomic.StoreInt32(&result2, 0)

    atomic.StoreInt32(&result1, 0)

    mutex.Unlock()

}

 

//no chan wait. no lock. suport ncpu = 16, fast wait

func wait(index int, inc *int32) {

    if index == (N - 1) {

        for {

            if *inc == READY {

                atomic.AddInt32(inc, READY << uint(N-1))

                break

            }

            runtime.Gosched()

        }

    } else {

        atomic.AddInt32(inc, 1 << uint(index))

        for {

            if *inc & (COMMIT << uint(index)) == 0 {

                runtime.Gosched()

                continue

            }

            //clean bit

            atomic.AddInt32(inc, -(COMMIT << uint(index) + 1 << uint(index)))

            break

        }

    }

}

 

马上也作证了一个题材,几乎是兼备状态都能走至,但是,我们须让所有的线程最终还能上下一个READY,这便是我说的回归。经过这些年之锤炼,我懂得的,并发状态而减小复杂性,就是若巧妙的计划一个方案,让状态回归,否则问题错综复杂了,怎么老犹非了解。可以省golang
sync.Mutex的源代码,非常适合我说之受状态最终回归的思想。

外汇 2

   
最经常来看的并是严防一个资源而为多个人访问,这里而介绍的齐问题如无相同一点,他是大抵只线程之间如果相互等待的平等栽共同,就比如我们出爬山,如果有人慢了,就如停下来等等他,这样我们才能同到达目的地。

func wait(index int, inc *int32) {

    if index == (N - 1) {

        for {

            if *inc == READY {

                atomic.AddInt32(inc, READY << uint(N-1))

                break

            }

            runtime.Gosched()

        }

    } else {

        atomic.AddInt32(inc, 1 << uint(index))

        for {

            if *inc & (COMMIT << uint(index)) == 0 {

                runtime.Gosched()

                continue

            }

            //clean bit

            atomic.AddInt32(inc, -(COMMIT << uint(index) + 1 << uint(index)))

            break

        }

    }

}

   
这个问题最初是于经济史数据反演的时候遇到的,简单的游说,拿同样份历史之股票或外汇,期货的数目,按照时间各个的套价格变东,通过一个算法来判定买卖,最后统计一下净利润的曲线。如下图所示:

发表评论

电子邮件地址不会被公开。 必填项已用*标注