我正在尝试构建一个简单的Golang /
Appengine应用程序,该应用程序使用通道来处理每个http请求。原因是我希望每个请求都执行合理的大内存计算,并且以线程安全的方式执行每个请求(即,并发请求的计算不会混淆)非常重要。
本质上,我需要一个同步队列,该队列一次只能处理一个请求,并且通道看起来很自然。
是否可以将Go的缓冲通道用作线程安全队列?
但是,我无法让我简单的hello world示例起作用。似乎在’goprocess(w,cr)’行上失败了;我从服务器收到200响应,但没有竞争。如果我在此行中消除了“ go”,则效果很好,但是我猜我没有正确调用该通道。
有人指出我要去哪里了吗?
谢谢!
// curl -X POST "http://localhost:8080/add" -d "{\"A\":1, \"B\":2}"
package hello
import (
"encoding/json"
"net/http"
)
type MyStruct struct {
A, B, Total int64
}
func (s *MyStruct) add() {
s.Total = s.A + s.B
}
func process(w http.ResponseWriter, cr chan *http.Request) {
r := <- cr
var s MyStruct
json.NewDecoder(r.Body).Decode(&s)
s.add()
json.NewEncoder(w).Encode(s)
}
func handler(w http.ResponseWriter, r *http.Request) {
cr := make(chan *http.Request, 1)
cr <- r
go process(w, cr) // doesn't work; no response :-(
// process(w, cr) // works, but blank response :-(
}
func init() {
http.HandleFunc("/add", handler)
}
不确定这是否是正确的设计,但我怀疑问题是在您启动第二个go例程的地方,第一个go例程继续并完成了写入连接等操作。
要停止此操作,您可以使用等待组(http://golang.org/pkg/sync/#WaitGroup)使第一个例程等待。
这阻止了您试图将其放入线程的全部理由(因此,我认为您遇到了设计问题)。
这是一些未经测试的代码,应该可以正常工作,或者至少在正确的方向上有所帮助。
package main
import (
"encoding/json"
"net/http"
"sync"
)
type MyStruct struct {
A, B, Total int64
}
func (s *MyStruct) add() {
s.Total = s.A + s.B
}
func process(w http.ResponseWriter, cr chan *http.Request) {
r := <- cr
var s MyStruct
json.NewDecoder(r.Body).Decode(&s)
s.add()
json.NewEncoder(w).Encode(s)
}
func handler(w http.ResponseWriter, r *http.Request) {
cr := make(chan *http.Request, 1)
cr <- r
var pleasewait sync.WaitGroup
pleasewait.Add(1)
go func() {
defer pleasewait.Done()
process(w, cr) // doesn't work; no response :-(
}()
// process(w, cr) // works, but blank response :-(
pleasewait.Wait()
}
func main() {
http.HandleFunc("/add", handler)
}
通常用于HTTP/HTTPS请求失败/成功等处理. 进程: 主进程 IncomingMessage是由 EventEmitter响应可读流接口 实例事件 事件: 'data' 用途:响应或回调传送到应用的数据 chunk Buffer - 响应正文的数据块. 事件: 'end' 触发:响应正文已结束时 事件: 'aborted' 触发:正在进行的HTTP事务期间请求已取消时 事件: 'error
问题内容: 我正在使用goroutines / channels检查网址列表是否可以访问。这是我的代码。这似乎总是返回true。为什么超时情况没有得到执行?目标是即使无法访问其中一个网址也要返回false 问题答案: 将在 当前的 goroutine(即正在运行的goroutine)中休眠。该语句仅在返回后才能正确运行,并且到那时,这两个分支都可以运行,并且运行时可以选择任何一个它。 您可以通过在
并发请求处理 我创建了一个服务器,并使用s.listenandserve()来处理请求。据我所知,这些请求是同时送达的。我使用一个简单的处理程序来检查它: 我看到,如果我发送了几个请求,我将看到所有的“1”出现,只有在一秒钟后所有的“2”出现。但是如果删除Hibernate行,我会看到程序在完成前一个请求之前从不启动请求(输出为1 2 1 2 1 2...)。所以我不明白,如果它们是并发的还是不是
问题内容: java.net.URLConnection这里经常问到使用的问题,而Oracle教程对此却过于简洁。 该教程基本上仅显示如何触发GET请求并读取响应。它没有任何地方说明如何使用它来执行POST请求,设置请求标头,读取响应标头,处理cookie,提交HTML表单,上传文件等。 因此,如何使用它java.net.URLConnection来触发和处理“高级” HTTP请求? 问题答案:
我一直试图向facebook发送HTTP POST请求,但没有成功。我从服务器收到以下响应: HTTP/1.1 400不良请求内容-类型:text/html;charset=utf-8日期:2016年12月10日星期六21:28:17 GMT连接:关闭内容-长度:2959 Facebook |错误 抱歉,出了点问题,我们正在修理,会尽快修好的 我的密码 我做错了什么?
我正在使用Java VertX框架,并尝试使用VertX WebClient和一个简单的HTTP请求加载多个JSON对象。我想并行地做这件事,这样可以加快进程。 我有一个endpoint对象: 在另一个类中,我有以下应该并行处理的函数(源代码): 我不知道如何继续下去。VertX WebClient强制我使用异步处理程序,这意味着我不能直接返回JsonObject。