Многопроцессорный пул с StarMap не работает должным образом - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь передать несколько аргументов функции

Я прочитал и попробовал решение из этого: Многопроцессорное поведение Python для Pool / starmap и это: Python для многопроцессорной обработки pool.map для нескольких аргументов

но оба, похоже, не работают.

Это мой код:

args = [
(1.42,'c',297.39,296,0.0192,0.019,d1,d0),(1.42,'c',297.39,290,0.0192,0.019,d1,d0)
]

with multiprocessing.Pool(processes=2) as pool:
    result = pool.starmap(greeks,args)

Кажется, это работает для первого набора аргументов, но затем я получаю эту ошибку:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/anaconda3/envs/py37/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/anaconda3/envs/py37/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/anaconda3/envs/py37/lib/python3.7/multiprocessing/pool.py", line 496, in _handle_results
    task = get()
  File "/anaconda3/envs/py37/lib/python3.7/multiprocessing/connection.py", line 251, in recv
    return _ForkingPickler.loads(buf.getbuffer())
TypeError: __init__() takes 1 positional argument but 2 were given

Я даже не знаю, почему существует Thread-3, поскольку я передал только 2 набора аргументов. Я хотел бы, чтобы это в конечном итоге работало для примерно 10-15 наборов аргументов

Редактировать: Полный код:

import py_vollib.black_scholes_merton.implied_volatility as BSM
from datetime import date
import quantsbin.derivativepricing as qbdp

def greeks(target_value, flag, S, K, r, div,t1,t0):
    if flag == 'c':
        call_put = 'Call'
    else:
        call_put = "Put"

    delta = t1-t0
    delta_annual = delta.days / 365
    d0s = t0.strftime('%Y%m%d')
    d1s = t1.strftime('%Y%m%d')

    sigma = BSM.implied_volatility(target_value, S, K, delta_annual, r, div, flag)

    risk_parameters = {'delta_spot': 0.02, 'delta_vol': 0.02, 'delta_rf_rate': 0.02,
                       'delta_time': 1}  # TODO Fix with next quantsbin release


    equity_o = qbdp.EqOption(option_type=call_put, strike=K, expiry_date=d1s, expiry_type='American')
    engine = equity_o.engine(model="Binomial", spot0=S, pricing_date=d0s,
                             rf_rate=r, yield_div=div, volatility=sigma)

    greeks = engine.risk_parameters(**risk_parameters)
    greeks['IV'] = sigma
    return greeks


d0 = date.today()
d1 = date(2019, 7, 5)


cpu=multiprocessing.cpu_count()-1

t1 = time.time()

args = [(1.42,'c',297.39,296,0.0192,0.019,d1,d0),(1.42,'c',297.39,290,0.0192,0.019,d1,d0)]

with multiprocessing.Pool(processes=cpu) as pool:
     result = pool.starmap(greeks,args)

t2= time.time()

print(result,'{:0.4}'.format(t2-t1))

Редактировать 2:

print(greeks(1.42,'c',297.39,296,0.0192,0.019,d1,d0))

Это работает и возвращает:

{'delta': 0.6168499226002772, 'gamma': 0.12714118324230908, 'theta': -0.025340261170400336, 'vega': 2.8379233244261832, 'rho': 1.3659174375347853, 'IV': 0.04311625476862159}

def g(a,b,c):
    return [a+b+c,a-b-c,a+b-c]

a = [(1,5,7),(4,7,2),(7,7,7)]

with multiprocessing.Pool(processes=cpu) as pool:
    result = pool.starmap(g,a)

также работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...