使用golang频道。(using golang channels. GETTING “all goroutines are asleep - deadlock!”)
iam目前正在玩例程,频道和sync.WaitGroup。 我知道waitgroup用于等待所有go例程根据天气wg完成.Done()被调用足够的时间来取消wg.Add()中设置的值。 我写了一小段代码试图在golang操场上测试这个。 显示如下
var channel chan int var wg sync.WaitGroup func main() { channel := make(chan int) mynums := []int{1,2,3,4,5,6,7,8,9} wg.Add(1) go addStuff(mynums) wg.Wait() close(channel) recieveStuff(channel) } func addStuff(mynums []int) { for _, val := range mynums { channel <- val } wg.Done() } func recieveStuff(channel chan int) { for val := range channel{ fmt.Println(val) } }
我遇到了死锁错误。 我试图等待路由返回wg.Wait()? 然后,关闭频道。 然后,将通道发送到recievestuff方法以输出切片中的值? 但它不起作用。 我已经尝试在循环之后在go例程中移动close()方法,因为我认为我可能一直在尝试关闭main()中的错误例程。 香港专业教育学院发现这个东西到目前为止来自java和c#相对混乱。 任何帮助表示赞赏。
iam currently playing around with go routines, channels and sync.WaitGroup. I know waitgroup is used to wait for all go routines to complete based on weather wg.Done() has been called enough times to derement the value set in wg.Add(). i wrote a small bit of code to try to test this in golang playground. show below
var channel chan int var wg sync.WaitGroup func main() { channel := make(chan int) mynums := []int{1,2,3,4,5,6,7,8,9} wg.Add(1) go addStuff(mynums) wg.Wait() close(channel) recieveStuff(channel) } func addStuff(mynums []int) { for _, val := range mynums { channel <- val } wg.Done() } func recieveStuff(channel chan int) { for val := range channel{ fmt.Println(val) } }
Iam getting a deadlock error. iam trying to wait on the routing to return with wg.Wait()? then, close the channel. Afterwards, send the channel to the recievestuff method to output the values in the slice? but it doesnt work. Ive tried moving the close() method inside the go routine after the loop also as i thought i may of been trying to close on the wrong routine in main(). ive found this stuff relatively confusing so far coming from java and c#. Any help is appreciated.
原文:https://stackoverflow.com/questions/39576130
最满意答案
如果我理解正确,您使用的是cancan的
authorize_resource
或load_and_authorize_resource
控制器帮助程序,它根据控制器操作名称计算用户能力。但是,对所有操作使用此帮助程序并不是必须的。 您可以跳过具有复杂能力逻辑和手动检查能力的操作。
例如:
class ParticipationsController < ApplicationController authorize_resource except: :create # skiping `authorize_resource` for `create` action # ... def create if creator_adds_someone_to_event? authorize! :add_to, @event end if user_signs_up_for_event? authorize! :sign_up_for, @event end # ... end
因此,您可以在同一控制器操作中检查许多不同的功能。 只需禁用该操作的默认
cancancan's
行为即可。If I understand correctly, you are using cancan's
authorize_resource
orload_and_authorize_resource
controller helper that calculates user abilities based on controller actions names.But it's not obligatory to use this helper for all actions. You can skip it for actions having complex ability logic and check abilities manually.
For example:
class ParticipationsController < ApplicationController authorize_resource except: :create # skiping `authorize_resource` for `create` action # ... def create if creator_adds_someone_to_event? authorize! :add_to, @event end if user_signs_up_for_event? authorize! :sign_up_for, @event end # ... end
So, you can check many different abilities in the same controller action. Just disable default
cancancan's
behaviour for the action.
相关问答
更多-
嗯,这是有效的: class Ability include CanCan::Ability def initialize(user) user ||= Admin.new # guest user (not logged in) if user.type == "Administrator" can :manage, Company elsif user.type == "Supervisor" can :manage, Company do ...
-
user.roles返回一个数组,你正在将数组与字符串user.roles == "admin"进行比较,这将始终为false 。 而是使用User模型中的方法user.role?(:admin)如user.role?(:admin)来检查角色 所以你的能力应该是这样的 class Ability include CanCan::Ability def initialize(user) user ||= User.new # guest user (not logged in) i ...
-
问题出在.permit中,我不得不将它直接添加到create_params方法中。 class ApiController < ActionController::API def create_params params.require(controller_name.classify.downcase.to_sym).permit(self.class::PERMITTED_PARAMS) end end The problem was in the .permit, I had to ...
-
can :manage, Task do |task| task.user_id == nil end can :manage, Task do |task| task.user_id == nil end
-
CanCanCan无意根据应用程序中的条件动态评估角色。 这种类型的功能最好由应用程序自己的逻辑处理,而不是授权工具。 您应该考虑在您的roles表中添加一列,以指示允许特定角色的帖子数量。 此列允许您检查允许每个用户(通过角色)创建的帖子数。 然后,在posts_controller.rb ,您可以将帖子创建逻辑包装在仅在用户未超过允许的最大帖子数时运行的块中: def create if user.posts.size < user.role.max_posts @post = Post.n ...
-
您的之前操作将针对控制器中的每个操作触发。 将其限制为“创建”操作: before_action :authorize_user, only: :create Your before action is triggered for every action in the controller. Limit it to 'create' action: before_action :authorize_user, only: :create
-
如果我理解正确,您使用的是cancan的authorize_resource或load_and_authorize_resource控制器帮助程序,它根据控制器操作名称计算用户能力。 但是,对所有操作使用此帮助程序并不是必须的。 您可以跳过具有复杂能力逻辑和手动检查能力的操作。 例如: class ParticipationsController < ApplicationController authorize_resource except: :create # skiping `authorize ...
-
将ActiveAdmin Sortable gem与资源,动作一起使用时 :sort 将添加到您的帖子的控制器。 我想你可以用 can(:sort, Post) 在ability.rb文件中。 您可能必须有条件地隐藏/显示可排序的句柄列。 我想你可以在索引部分这样做: index do sortable_handle_column if can?(:sort, Post) end When using ActiveAdmin Sortable gem with a resource, an act ...
-
假设有has_many / belongs_to类型的assciation你可以很容易地这样做: can [:create, :read], ProjectQuestion do |project_question| can? :read, project_question.project end 请注意,在检查能力之前,您必须将project_id分配给新的project_question。 因此,在您的控制器/视图中,您无法做到 can? :create, ProjectQuestion.new ...
-
在深入研究代码后,我发现了正在发生的事情。 ActiveAdmin和它的CanCanAdapter还不兼容CanCanCan的check_authorization方法。 该方法依赖于授权方法在控制器上设置的@_authorized实例变量,但ActiveAdmin的授权不设置此变量。 因此,即使ActiveAdmin IS执行授权, check_authorization始终会失败,因为ActiveAdmin未设置此实例变量。 我已经报告了这个问题,但是现在的解决方法是将一个unless:子句添加到与所有 ...