在两个核心上进行数据的读取和利用的问题


#1

我希望实现一个程序,在核心2上程序将读入的数据写入一个Channel,在核心1上程序从Channel读出数据并进行后续工作,以下demo是我的小想法,但是存在几点问题:
1.Channel同时在两个核心上进行了定义,在核心1上定义的Channel完全不会用到,并且
不定义g函数时,无法直接take!(好像会take!成核心1上的)
2.文档里关于RemoteChannel的描述太少,本来以为可以用这个的,但是实际操作不太明白
希望大家可以就以上问题给予我一些帮助

using Distributed
addprocs(1)
@everywhere c = Channel(1)
@everywhere f() = put!(c, 1)
@everywhere g() = take!(c)
remotecall(f, 2)
data = remotecall_fetch(g, 2)

#2

A1:这种多进程并行显然首先你得明白,各个进程的数据是不共享的,所以你需要在各个进程上定义相同的函数之类的。Channel 也只能在同一个进程里面用,其他Worker看不到本Worker的Channel,反之亦然。所以你调用take!必然是调用本进程里声明的那个。
A2:关于RemoteChannel,这个就是说用来在不同进程间交换的,具体使用看下面的例子。

using Distributed
addprocs(1)
const c=RemoteChannel(()->Channel{Int}(10))
@everywhere f(c,i::Int) = put!(c, i)
@everywhere g(c) = take!(c)
remotecall(f,2,c,3)
@assert remotecall_fetch(g,1,c)==3

#3

根据你提供的思路和代码我试了一下,以下代码可以正常工作:

using Distributed
addprocs(1)
c = RemoteChannel()
remotecall(put!, 2, c, 1)
take!(c)

所以RemoteChannel确实可以作为联系不同核心间的通道,完美解决了我的问题,感谢!