Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: 'tuple' object is not callable while calling multiprocessing in python

I am trying to execute the following script by using multiprocessing and queues,

from googlefinance import getQuotes
from yahoo_finance import Share
import multiprocessing


class Stock:

    def __init__(self,symbol,q):
        self.symbol = symbol
        self.q = q

    def current_value(self):
        current_price =self.q.put(float(getQuotes(self.symbol)[0]['LastTradeWithCurrency']))
        return current_price

    def fundems(self):

        marketcap = self.q.put(Share(self.symbol).get_market_cap())
        bookvalue = self.q.put(Share(self.symbol).get_book_value())
        dividend = self.q.put(Share(self.symbol).get_dividend_share())
        dividend_paydate = self.q.put(Share(self.symbol).get_dividend_pay_date())
        dividend_yield = self.q.put(Share(self.symbol).get_dividend_yield())

        return marketcap, bookvalue, dividend, dividend_paydate, dividend_yield



def main():
    q = multiprocessing.Queue()
    Stock1 = Stock('aapl', q) 


    p1 = multiprocessing.Process(target = Stock1.current_value(), args = (q,))
    p2 = multiprocessing.Process(target = Stock1.fundems(), args = (q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    while q.empty() is False:
        print q.get()


if __name__ == '__main__':
    main()

I am getting the output as the following:

Process Process-2:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
TypeError: 'tuple' object is not callable
139.52
732.00B
25.19
2.28
2/16/2017
1.63

Here I see that I am able to get the output which I wanted, but there was an error before that which is kind a making me confused.

Can anyone please help me understand the concept here.

Thanks in advance.

like image 343
Bhargav Avatar asked Jun 20 '26 17:06

Bhargav


1 Answers

The target should be an uncalled function, you're calling the function in the parent process and trying to launch a Process with the results of the call as the target. Change:

p1 = multiprocessing.Process(target = Stock1.current_value(), args = (q,))
p2 = multiprocessing.Process(target = Stock1.fundems(), args = (q,))

to:

p1 = multiprocessing.Process(target=Stock1.current_value)
p2 = multiprocessing.Process(target=Stock1.fundems)

q is removed as an argument because the object was constructed with q, and uses its own state to access it, it doesn't receive it as an argument to each method.

like image 54
ShadowRanger Avatar answered Jun 22 '26 07:06

ShadowRanger



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!