Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RuntimeError (Circular dependency detected while autoloading constant Apps multithreading

I'm receiving this error: RuntimeError (Circular dependency detected while autoloading constant Apps

when I'm multithreading. Here is my code below. Why is this happening? The reason I am trying to multithread is because I am writing a HTML scraping app. The call to Nokogiri::HTML(open()) is a synchronous blocking call that takes 1 second to return, and I have 100,000+ pages to visit, so I am trying to run several threads to overcome this issue. Is there a better way of doing this?

class ToolsController < ApplicationController

def getWebsites
    t1=Thread.new{func1()}
    t2=Thread.new{func1()}
    t3=Thread.new{func1()}
    t4=Thread.new{func1()}
    t5=Thread.new{func1()}
    t6=Thread.new{func1()}
    t1.join
    t2.join
    t3.join
    t4.join
    t5.join
    t6.join
end

def func1
    puts Thread.current
    apps = Apps.order("RANDOM()").where("apps.website IS NULL").take(1)
    while apps.size == 1  do
        app = apps[0]
        puts app.name
        puts app.iTunes
        doc = Nokogiri::HTML(open(app.iTunes))
        array = doc.css('div.app-links a').map { |link| 
            url = link['href'] 
            url = Domainatrix.parse(url)
            url.domain + "." + url.public_suffix
        }
        array.uniq!
        if (array.size > 0)
            app.website = array.join(', ')
            puts app.website
        else
            app.website = "NONE"
        end
        app.save
        apps = Apps.order("RANDOM()").where("apps.website IS NULL").take(1)
    end 
end


end
like image 218
etayluz Avatar asked Dec 16 '14 23:12

etayluz


People also ask

How do you fix a circular dependency problem?

To fix the error, we can either move the formula to another cell, or change the reference in the formula so that it refers to another cell. What is this? In this case we will change the cell reference to cell B1. As you can see in the image below, this adjustment has fixed the circular dependency error.

How do I remove circular dependency?

Circular Dependencies occurs when Module A consumes part or Module B while Module B consumes part of Module A. To fix this you should check if A and B are strongly link together. If No, then just move the part being consumes to the proper module.

How do I remove circular dependency in Powerbi?

Therefore, you experience circular dependency only once you have created the second column. The correct solution to avoid this is to restrict the list of columns that the calculated column depends on, by using ALLEXCEPT or REMOVEFILTERS and keeping only the table's primary key.

What is circular dependency and how is it resolved?

A circular dependency is where Project A depends on something in Project B and project B depends on something in Project A. This means to compile Project A you must first compile Project B, but you can't do that as B requires A to be compiled. This is the problem that circular dependencies cause.


1 Answers

"require" isn't thread-safe

Change your methods so that everything that is to be "required" is done so before the threads start.

For example:

def get_websites
    # values = Apps.all # try uncommenting this line if a second-try is required

    ar = Apps.where("apps.website IS NULL")

    t1 = Thread.new{ func1(ar) }
    t2 = Thread.new{ func1(ar) }

    t1.join
    t2.join
end

def func1( ar )
    apps = ar.order("RANDOM()").limit(1)

    while (apps.size == 1)
      puts Thread.current
    end 
end

But as somebody pointed out, the way you're multithreading within the controller isn't advised.

like image 175
SHS Avatar answered Nov 15 '22 06:11

SHS