def Sequence(*plist, **kwargs):
    """ Sequence(P1, [P2, .. ,PN])

    Performs synchronous execution of the supplied CSP processes. 
    
    The supplied processes are executed in order.

    Blocks until the last process has exited.
  
    Usage:
      >>> @process
      ... def P1(id):
      ...     print(id)

      >>> L = [P1(i) for i in range(10)]
      >>> Sequence(L)
    """
    processes=[]
    for p in plist:
        if type(p)==list:
            for q in p:
                processes.append(q)
        else:
            processes.append(p)

    # Update process parameters
    if kwargs:
        for p in processes:
            p.update(**kwargs)

    # Run processes sequentially but each as a real separate process.
    # For simplicity we no longer execute the .run method directly,
    # but use the same approach as in the _parallel function.
    return_values = []
    for p in processes:
        p.start()
        return_values.append(p.join_report())
    
    return return_values