从另一个节点启动流?

时间:2017-10-08 09:54:44

标签: elixir

我在节点上创建了一个文件流,我担心文件访问,如果我从另一个节点启动流怎么办?

就像,在节点A上,我创建流而不启动它:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- always start out matching the document root -->
    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <!-- match the root element (not shown in your example) -->
    <xsl:template match="root">
        <xsl:element name="product">
            <!-- apply templates in the desired order, specifically selecting matching 'data' elements -->
            <xsl:apply-templates select="data[name/text() = 'id']" />
            <xsl:apply-templates select="data[name/text() = 'att1']" />
            <xsl:apply-templates select="data[name/text() = 'att2']" />
            <xsl:apply-templates select="data[name/text() = 'status']" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="data">
        <!-- choose the desired output element based on the current data/name text -->
        <xsl:choose>
            <xsl:when test="./name[text() = 'id']">
                <xsl:element name="id">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:when test="./name[text() = 'att1']">
                <xsl:element name="color">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:when test="./name[text() = 'att2']">
                <xsl:element name="size">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:when test="./name[text() = 'status']">
            <xsl:element name="avail">
                    <xsl:value-of select="./value" />
                </xsl:element>
            </xsl:when>
            <xsl:otherwise />
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

然后,在节点B上,我启动流:

xsl-foreach

流会按预期在节点A上查找文件吗?或者它会在节点B中查找它吗?(考虑节点B是流的起始位置),因为如果这样做会失败,因为该文件实际上存在于节点A上。

我应该关联存储文件的节点吗?我该怎么办?我需要吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

File.stream!返回File.Stream结构,其中包含4个字段:pathmodesrawline_or_bytes。该文件实际上仅在执行流时才打开,例如使用例如Stream.run/1或任何Enum功能。当您使用Agent将该结构传递给另一个节点时,仅传递此4字段结构,如果您在该另一个节点上调用Stream.run,该节点将尝试打开{指向的文件{1}}如果该节点的文件系统上没有文件,则会失败。因此,您的问题的答案是,除非文件存在于同一路径,否则操作将失败。

另一方面,Elixir中的文件句柄是PID,它在内部存储对打开的文件的引用。它们可以创建,例如使用path。如果将此调用返回的PID传递给另一个节点,然后对其执行操作,例如在该节点上File.open!/1(不是IO.read),它将成功,因为操作作为消息发送到PID。如果文件句柄的PID来自另一个节点,则文件操作通过连接透明传输。因此,如果您想要访问这样的文件,可以使用File.read,然后从另一个节点使用File.open!