# \[DAG\]\[Workflows\] How can I chain tasks without returns

**URL:** https://discuss.ray.io/t/dag-workflows-how-can-i-chain-tasks-without-returns/9927
**Category:** Ray Workflows
**Created:** [March 28, 2023, 5:45am UTC](https://discuss.ray.io/t/dag-workflows-how-can-i-chain-tasks-without-returns/9927 "2023-03-28T05:45:32Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![dirtyValera](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/dirtyvalera/32/1575_2.png) [@dirtyValera](https://discuss.ray.io/u/dirtyValera)
#### Post date: [March 28, 2023, 5:45am UTC](https://discuss.ray.io/t/dag-workflows-how-can-i-chain-tasks-without-returns/9927/1 "2023-03-28T05:45:32Z")

</div>

Normally to construct dependant tasks I do:

```auto
@ray.remote
def t1():
    print('t1')
    return 't1'

@ray.remote
def t2_depends_on_t1(t1_result):
  res = 't2 ' + str(t1_result)
  print(res)
  return res

dag = t2_depends_on_t1.bind(t1.bind())
ray.get(dag.execute())

```

this works fine, i get `t1` and then `t2 t1`

But what do I do if both `t1` and `t2_depends_on_t1` don’t return anything and don’t take in params, but I still want to enforce execution order in DAG?

I try

```auto
@ray.remote
def t1():
    print('t1')
    return 't1'

@ray.remote
def t2_depends_on_t1():
    print('t2')
    return 't2'

dag = t2_depends_on_t1.bind(t1.bind()) 
ray.get(dag.execute())

```

but I get `TypeError: too many positional arguments`

How do I do this?

---

<div class="post-metadata">

### Author: ![dirtyValera](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/dirtyvalera/32/1575_2.png) [@dirtyValera](https://discuss.ray.io/u/dirtyValera)
#### Post date: [April 4, 2023, 7:10am UTC](https://discuss.ray.io/t/dag-workflows-how-can-i-chain-tasks-without-returns/9927/2 "2023-04-04T07:10:59Z")

</div>

Bumping up, any help? Thanks!

---

<div class="post-metadata">

### Author: ![yic](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ray.io/yic/32/437_2.png) [@yic](https://discuss.ray.io/u/yic)
#### Post date: [April 4, 2023, 10:20pm UTC](https://discuss.ray.io/t/dag-workflows-how-can-i-chain-tasks-without-returns/9927/3 "2023-04-04T22:20:44Z")

</div>

> [@dirtyValera](#):
>
> But what do I do if both `t1` and `t2_depends_on_t1` don’t return anything and don’t take in params, but I still want to enforce execution order in DAG?

Taking input params is forced to build a DAG. It’s like you specify what’s the upstream of this specific node.

For return, you can just return None. Some code like follow:

```auto
@ray.remote
def t1():
    print('t1')

@ray.remote
def t2_depends_on_t1(upstream):
    print('t2')

dag = t2_depends_on_t1.bind(t1.bind()) 
ray.get(dag.execute())

```

---

<div class="post-metadata">

### Author: ![wub](https://avatars.discourse-cdn.com/v4/letter/w/e56c9b/32.png) [@wub](https://discuss.ray.io/u/wub)
#### Post date: [August 24, 2023, 2:24pm UTC](https://discuss.ray.io/t/dag-workflows-how-can-i-chain-tasks-without-returns/9927/4 "2023-08-24T14:24:11Z")

</div>

> [@yic](#):
>
> ```auto
> 
> ```

maybe pass in \*args?
