Python:在随机图上调用Networkx和函数的线程安全方式
我创建了这个程序,主要是为了了解Networkx和并行化是如何工作的:Python:在随机图上调用Networkx和函数的线程安全方式,python,multithreading,random,thread-safety,networkx,Python,Multithreading,Random,Thread Safety,Networkx,我创建了这个程序,主要是为了了解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 w
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个不同的图,我应该如何修改它?生成每个图形后,我应该用某种方法更改种子还是有一种better方法?甚至有必要使用可选参数seed=seed调用networkx吗?我正在阅读NetworkX的文档,它可能会使用全局随机生成器生成随机图,我有点担心
2) 如果我将程序中选择随机数目的节点的部分放在一个单独的函数中,并从代码的并行部分调用它,它会使用“正确的”种子来使向量随机化吗
3) 有没有更好的方法来并行创建随机图,然后从种子(可能是用户给定的)开始在这些图上拾取随机节点
我正在使用NetworkX 2.2版、numpy 1.15.4版、python 2.7版我试图运行您的示例代码,但似乎包装器
@wrapps(func)
没有在任何地方导入或定义。你能添加相关代码吗?是的,只需从functools导入包装添加即可。我正在修改帖子