Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dask-是否可以使用自定义函数的每个工作线程中的所有线程?_Python_Dask_Python Multithreading - Fatal编程技术网

Python Dask-是否可以使用自定义函数的每个工作线程中的所有线程?

Python Dask-是否可以使用自定义函数的每个工作线程中的所有线程?,python,dask,python-multithreading,Python,Dask,Python Multithreading,在我的例子中,S3中有几个文件和一个自定义函数,它们读取每个文件并使用所有线程进行处理。为了简化示例,我只生成一个数据帧df,并假设我的函数是tsfresh.extract\u features,它使用多处理 生成数据 将熊猫作为pd导入 从tsfresh导入提取功能 从tsfresh.examples.robot_execution_failures导入下载_robot_execution_failures\ 加载\机器人\执行\失败 下载机器人执行失败() ts,y=加载\机器人\执行\失败

在我的例子中,S3中有几个文件和一个自定义函数,它们读取每个文件并使用所有线程进行处理。为了简化示例,我只生成一个数据帧
df
,并假设我的函数是
tsfresh.extract\u features
,它使用多处理

生成数据
将熊猫作为pd导入
从tsfresh导入提取功能
从tsfresh.examples.robot_execution_failures导入下载_robot_execution_failures\
加载\机器人\执行\失败
下载机器人执行失败()
ts,y=加载\机器人\执行\失败()
df=[]
对于范围(5)中的i:
tts=ts.copy()
tts[“id”]+=88*i
追加(tts)
df=pd.concat(df,忽略索引=True)
作用
def fun(df,n_作业):
提取的特征=提取的特征(df,
列_id=“id”,
列\u sort=“时间”,
n_作业=n_作业)
导入dask
从dask.distributed import Client,进度
从dask导入计算,延迟
从dask_cloudprovider导入FargateCluster
我的vpc=#你的vpc
我的子网=#你的子网
cpu=2
ram=4
集群=FargateCluster(n_工人=1,
image='rpanai/feats worker:2020-08-24',
专有网络=我的专有网络,
子网=我的子网,
工人cpu=int(cpu*1024),
worker_mem=int(ram*1024),
cloudwatch_logs_group=“my_log_group”,
任务角色策略=['arn:aws:iam::aws:policy/AmazonS3FullAccess'],
计划程序\u超时='20分钟'
)
集群自适应(最小值=1,
最大值=4)
客户端=客户端(群集)
客户
使用所有工作线程(失败)
to_进程=[范围(10)内i的延迟(fun)(df,cpu)]
out=计算(到_进程)
仅使用一个线程(OK) 在这种情况下,它工作正常,但我在浪费资源

to_进程=[范围(10)内i的延迟(fun)(df,0)]
out=计算(到_进程)
问题: 我知道,对于这个特定的函数,我最终可以使用多线程和其他一些技巧编写一个自定义函数,但我希望分配一个作业,让每个工作人员都可以利用所有资源,而不必太担心

更新 该函数只是一个示例,实际上它在实际特征提取之前和之后都进行了某种清理,并将其保存到
S3

def fun(文件名、bucket\u名称、文件名\u out、n\u作业):
#
df pd.read_拼花地板(f“s3://{bucket_name}/{filename}”)
#打扫
提取的特征=提取的特征(df,
列_id=“id”,
列\u sort=“时间”,
n_作业=n_作业)
将特征提取到拼花地板(f“s3://{bucket\u name}/{filename\u out}”)

我可以帮助您回答有关
tsfresh
的特定问题,但如果
tsfresh
只是一个简单的玩具示例,可能不是您想要的

对于
tsfresh
,您通常不会混合使用
tsfresh
和dask的多处理,而是让dask完成所有处理。这意味着,您可以从单个
dask.DataFrame
(在您的测试用例中,您可以将pandas数据帧转换为dask数据帧-对于您的读取用例,您可以直接从
S3
)读取),然后在dask数据帧中分发特征提取(特征提取的好处是,它在每个时间序列上独立工作。因此,我们可以为每个时间序列生成单个作业)

当前版本的
tsfresh
(0.16.0)有一个小的帮助函数,可以为您执行此操作:。 在下一个版本中,甚至可以直接在dask数据帧上运行
extract_features

我不确定这是否有助于解决您更一般的问题。在我看来,您(在大多数情况下)不希望混合使用dask的分布函数和“本地”多核计算,而只是让dask处理所有问题。因为如果您在dask群集上,您甚至可能不知道每台机器上有多少个核(或者你可能每个工作只能得到一份)


这意味着,如果您的作业可以被分发N次,并且每个作业都将启动M个子作业,那么您只需将“N x M”作业交给dask,让它计算出其余作业(包括数据位置)。

谢谢您的回答。我花了一些时间对其进行了测试。我尝试了建议的解决方案,但在200个文件上安排数据需要更长的时间(实际特征提取之前)比只使用一个线程版本。你可以检查我更新的问题。
AssertionError: daemonic processes are not allowed to have children