Python: Потокобезопасный способ вызова Networkx и функций на случайных графах - PullRequest
0 голосов
/ 09 декабря 2018

Я создал эту программу, главным образом, чтобы понять, как работают Networkx и распараллеливание:

import random
import numpy as np
import networxk as nx
import multiprocessing
from functools import wraps

def unpack(func):
    @wraps(func)
    def wrapper(arg_tuple):
        return func(*arg_tuple)
    return wrapper

 @unpack
 def parallel_job(seed,shift):
     N = 1000
     k = 10
     random.seed(seed)
     np.random.seed(seed) 
     #Use Networkx to generate a random graph.           
     G = nx.erdos_renyi_graph(int(N),k/float(N), seed = seed) 
     #select 10 random nodes and print them
     for j in range(10):
         I = [10]
         S = [N - I[0]]
         X = np.array([0]*S[0] +[1]*I[0]).reshape((N,1))
         np.random.shuffle(X) 
         print X                 



if __name__ == "__main__":
        threadnum = 10           
        simnum = 10
        seed = [j*2759 + 37*j**2 + 4757 for j in range(threadnum)]
        shift = [j*simnum for j in range(simnum)

        pool = multiprocessing.Pool(threadnum)
        arguments = zip(shift,seed)
        #spawn threadnum threads and give them parallel jobs
        pool.map(parallel_job, iterable=arguments) 

Так что эта программа определяет вектор начальных чисел, порождает определенное количество потоков, для каждого потока, который она назначает начальное число,Затем генерирует случайный граф с этим начальным числом, а затем выбирает и печатает 10 раз случайный выбор узлов.

Мои вопросы:

1) если вместо того, чтобы генерировать ровно один график на поток, я хотел бы создать m разных графиков, как мне его изменить?после того, как я сгенерирую каждый график, я должен изменить начальное значение каким-либо методом или есть способ лучше?Обязательно ли вызывать networkx с необязательным аргументом seed = seed?Я читаю в документации NetworkX, что он может использовать глобальный генератор случайных чисел для создания случайного графа, и я немного волнуюсь

2) Если я поставлю часть программы, которая выбирает случайное число узловв отдельной функции, и я вызываю ее из распараллеленной части кода, будет ли она использовать «правильное» начальное число для рандомизации вектора?

3) Есть ли лучший способ для создания случайных графов параллельно, а затемвыбрать случайные узлы на этих графиках, начиная с начального числа (которое может быть задано пользователем)?

Я использую NetworkX версии 2.2, numpy 1.15.4, python 2.7

...