如何为asyncio创建自定义传输?

时间:2017-10-16 14:12:12

标签: python python-asyncio

我正在阅读Protocol包中的Transportasyncio类的文档。具体做法是:

  

在子类化协议类时,建议您覆盖某些方法。这些方法是回调:它们将由传输在某些事件上调用(例如,当收到某些数据时);你不应该自己打电话,除非你正在实施交通工具。

强调添加

因此,原则上应该可以实现传输,但是......

  

传输是asyncio提供的类,用于抽象各种通信信道。您通常不会自己实例化运输;相反,您将调用一个AbstractEventLoop方法 (哪一个?),它将创建传输并尝试启动底层通信通道,并在成功时回拨。

再次强调了

阅读关于AbstractEventLoop的部分我并没有看到任何创建自定义传输的方法。它最接近的是AbstractEventLoop.create_connection(protocol_factory, host=...),这只暗示它会创建某种插座......

好吧,我的最终目标是使用自定义传输,它不是任何类型的套接字(可能是StringIO,也许是数据库连接游标,也许是另一种协议。)

那么,这只是一个很好的但是从未在文档中实现过的错误,或者实际上有一种方法可以实现自定义传输而不需要修补asyncio并牺牲第一个生命值?

1 个答案:

答案 0 :(得分:6)

需要一些样板代码,尽管它不是太多:

GOHeat_fix <- function (data, nlfc, fill.col) 
{
  x <- y <- z <- NULL
  if (missing(nlfc)) 
    nlfc <- 0
  else nlfc <- nlfc
  if (missing(fill.col)) 
    fill.col <- c("firebrick", "white", "dodgerblue")
  else fill.col <- fill.col
  distance <- dist(data)
  cluster <- hclust(distance)
  M <- dim(data)[2]
  nterm <- M - nlfc
  if (nlfc == 0) {
    s <- rowSums(data[, 1:nterm])
    tmp <- NULL
    for (r in 1:nrow(data)) {
      tmp <- c(tmp, as.numeric(gsub(1, s[r], data[r, 1:nterm])))
    }
  }
  else {
    tmp <- NULL
    for (r in 1:nrow(data)) {
      tmp <- c(tmp, as.numeric(gsub(1, data[r, (nterm + 
                                                  1)], data[r, 1:nterm])))
    }
  }
  df <- data.frame(x = factor(rep(cluster$order, each = nterm)), y = rep(colnames(data[, 
                                                                               1:nterm]), length(rownames(data))), z = tmp, lab = rep(rownames(data), 
                                                                                                                                      each = nterm))
  df_o <- df[order(df$x), ]
  g <- ggplot() +
    geom_tile(data = df_o, aes(x = x, y = y, fill = z)) +
    scale_x_discrete(breaks = 1:length(unique(df_o$x)), labels = unique(df_o$lab)) +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
          axis.title.x = element_blank(),
          axis.title.y = element_blank(), 
          axis.text.y = element_text(size = 14),
          panel.background = element_blank(), 
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank()) +
    coord_fixed()
  if (nlfc == 0) {
    g + scale_fill_gradient2("Count", space = "Lab", low = fill.col[2], 
                             mid = fill.col[3], high = fill.col[1])
  }
  else {
    g + scale_fill_gradient2("logFC", space = "Lab", low = fill.col[3], 
                             mid = fill.col[2], high = fill.col[1])
  }
}